我正在为一些非常糟糕的 HTML 编写自定义解析器/数据提取器。
更改 HTML 是不可能的。
我不会告诉你我必须跳过的篮球的细节,但我现在已经非常接近我最初的目标了。我正在使用 DOMDocument getElementByName、正则表达式替换(我知道,我知道...)和 XPath 查询的组合。
我需要从文档正文中取出所有文本。我希望导航保持一个单独的实体,至少在摘要中是这样。这就是我现在正在做的事情:
$contentnodes = $xpath->query("//body//*[not(self::a)]/text()|//body//ul/li/a");
foreach ($contentnodes as $contentnode) {
$type = $contentnode->nodeName;
$content = $contentnode->nodeValue;
$output[] = array( $type, $content);
}
这行得通,除了它当然会以不同的方式处理页面上的所有链接,我只希望它对导航这样做。
我可以使用什么 XPath 语法,以便在该查询的第一部分中,在 . 之前,|
我告诉它获取除.body
ul > li > a
请注意,我不能依赖p
标签或h1
标签或任何类似的东西来对内容进行有根据的猜测。
谢谢
更新:@hr_117 下面的回答有效。我还发现您可以使用多个not
语句,如下所示:
//body//text()[not(parent::a/parent::li/parent::ul)][not(parent::h1)]