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

时间:2013-06-19 17:33:17

标签: php html xpath

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

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

//body//text()[not(parent::a/parent::li/parent::ul)]|//body//ul/li/a

答案 1 :(得分:1)

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

test