【问题标题】:XPath in PHP: Get all text nodes, except navigationPHP 中的 XPath:获取所有文本节点,导航除外
【发布时间】:2013-06-20 02:22:07
【问题描述】:

我正在为一些非常糟糕的 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 的孩子的所有文本节点except ul > li > a.

请注意,我不能依赖 p 标签或 h1 标签或任何类似的东西来对内容进行有根据的猜测。

谢谢

更新:@hr_117 的回答如下。我还发现您可以像这样使用多个 not 语句:

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

【问题讨论】:

    标签: php html xpath


    【解决方案1】:

    你可以试试这样的:

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

    【讨论】:

      【解决方案2】:
      //body//*[not(self::a/parent::li/parent::ul)]/text()[normalize-space()]|//body//ul/li/a
      

      (test)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 2023-03-27
        • 2017-02-24
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多