【问题标题】:Select nodeValue but exclude child elements选择 nodeValue 但排除子元素
【发布时间】:2012-02-29 19:35:43
【问题描述】:

假设我有这个代码:

<p dataname="description">
Hello this is a description. <a href="#">Click here for more.</a>
</p>

如何选择p的nodeValue但排除a及其内容?

我当前的代码:

$result = $xpath->query("//p[@dataname='description'][not(self::a)]");

我选择$result-&gt;item(0)-&gt;nodeValue;

【问题讨论】:

    标签: php xml dom xpath domdocument


    【解决方案1】:

    只需将 /text() 附加到您的查询即可解决问题

    $result = $xpath->query("//p[@dataname='description'][not(self::a)]/text()");
    

    【讨论】:

    • 你能解释一下为什么会这样吗?
    • 没有 /text() 你选择整个节点,包括它的孩子。元素节点本身没有文本,而是将文本存储在称为文本节点的子节点中。 nodeValue 用于获取节点的文本值。在具有子节点的节点上调用 nodeValue 会获取所有子文本节点并将它们连接起来。使用 /text() 您只能获取文本类型的第一个子节点,因此只能获取此文本节点的文本
    【解决方案2】:

    不确定 PHP 的 XPath 是否支持这一点,但这个 XPath 在 Scrapy(基于 Python 的抓取框架)中为我解决了问题:

    $xpath->query('//p[@dataname='description']/text()[following-sibling::a]')
    

    如果这不起作用,请尝试 Kristoffers 解决方案,或者您也可以使用正则表达式解决方案。例如:

    $output = preg_replace("~&lt;.*?&gt;.*?&lt;.*?&gt;~msi", '', $result-&gt;item(0)-&gt;nodeValue);

    这将删除其中包含任何内容的任何 HTML 标记,不包括未被 HTML 标记封装的文本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2013-09-28
      • 1970-01-01
      相关资源
      最近更新 更多