PHP中的XPath:获取除导航之外的所有文本节点


XPath in PHP: Get all text nodes, except navigation

我正在为一些非常糟糕的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)]

您可以尝试这样做:

//body//text()[not(parent::a/parent::li/parent::ul)]|//body//ul/li/a
//body//*[not(self::a/parent::li/parent::ul)]/text()[normalize-space()]|//body//ul/li/a

(测试)