我想使用 XPath 和 PHP 将节点的内容提取为字符串

Posted

技术标签:

【中文标题】我想使用 XPath 和 PHP 将节点的内容提取为字符串【英文标题】:I want to extract the contents of a node as a string using XPath and PHP 【发布时间】:2011-04-11 16:17:31 【问题描述】:

我有一个接受通用 html 文件和通用 XPath 表达式的函数。我想提取包含整个文本(包括 HTML 标签)的匹配节点的字符串。 这是一个简化的示例...

<?php
$inDocStg = "
    <html><body>
    <div>The best-laid<br> schemes o' <span>mice</span> an' men
        <img src='./mouse.gif'><br>
    </div>
    </body></html>
    ";

$xPathDom = new DOMDocument();
@$xPathDom->loadHTML( $inDocStg );
$xPath = new DOMXPath( $xPathDom );
$matches = $xPath->query( "//div" );
echo $matches->item(0)->nodeValue;
?>

这会产生(我正在查看生成的 HTML 源 - 而不是浏览器输出)...

The best-laid schemes o' mice an' men

(HTML 标记已被剥离)。

但我想要的是……

The best-laid&lt;br&gt; schemes o' &lt;span&gt;mice&lt;/span&gt; an' men&lt;img src='./mouse.gif'&gt;&lt;br&gt;

谢谢。

【问题讨论】:

如果你尝试访问 __tostring 的魔法方法会发生什么? ..echo $matches-&gt;item(0) ? 嗨罗伯特皮特。不知道你到底是什么意思。 echo $matches->item(0)->nodeValue.toString();产生错误。 echo $matches->item(0).toString();也会产生错误。 __toString() 是一个神奇的方法,当你尝试回显和反对时它会自动调用,所以你只需要使用 echo $matches-&gt;item(0) 并且取决于 __tostring 产生的内容,可能会给你元素.检查我的帖子! 【参考方案1】:

你如何包装你的输出arround &lt;pre&gt;标签echo "&lt;pre&gt;" . $matches-&gt;item(0)-&gt;nodeValue . "&lt;/pre&gt;";

【讨论】:

嗨,C0mrade。这会产生:
The best-laid scheme o' mice an' men
它包含在我感兴趣的字符串中的文本,而不是它在浏览器上的显示方式(我只是将它回显到浏览器看看它做了什么)。
【参考方案2】:

试试这两个!

1

echo $matches->item(0)->textContent;

2

echo $matches->item(0);

第一个返回此节点及其后代的文本内容,第二个尝试访问魔术方法 __toString().. 取决于 DOMDocument 的构建方式,它可能是您已经获得的值。

【讨论】:

嗨,textContent 给出的结果与 nodeValue 相同。第二个建议产生错误。 __toString() 没有为 DOMNode 定义。【参考方案3】:

这可以工作,但没有 XPath;

$xPathDom = new DOMDocument();
$xPathDom->loadHTML( $inDocStg );
echo $xPathDom->saveXML($xPathDom->getElementsByTagName('div')->item(0));

$xPathDom = new DOMDocument();
$xPathDom->loadHTML( $inDocStg );
$xPathDom->getElementsByTagName('div')->item(0);
echo $xPathDom->saveHTML();

【讨论】:

DOMXPath::query 返回 DOMNodeList 因此它应该可以正常工作,因为您传递与 X-&gt;item(0) 相同的实体类型 - $xPath-&gt;query( "//div" )-&gt;item(0) 返回与 $X-&gt;getElementsByTagName('div')-&gt;item(0) 相同的实体类型 这不起作用。我粘贴了上面的代码('... Xpath will be'之后的位)它只是打印出整个 HTML 文档而不是 xpath 选择的节点内容。你让它工作了吗?我还在 $xPath->query( "//div" )->item(0) 上尝试了 saveHTML() ,这产生了一个错误。 @spiderPlant0。是的,编辑没有按您需要的方式工作,我删除并留下了没有 XPath 的那些,因为它不是您要寻找的答案。 另外,我不能使用 getElementsByTagName('div') 因为我需要一个通用的 xPath 表达式(我的例子是简化的)。 $xPathDom-&gt;saveHTML($matches-&gt;item(0)) 或在此代码上echo $xPathDom-&gt;saveHTML($xPathDom-&gt;getElementsByTagName('div')-&gt;item(0));

以上是关于我想使用 XPath 和 PHP 将节点的内容提取为字符串的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 提取节点的 XPATH 或 CSS 路径

Xpath轴与步长应用:取某节点下所有子孙节点里的文本内容

使用 Xpath 将 XML 节点提取到 Hive 表中

python里的爬虫如何使用xpath 提取script里的元素?

使用 XPath 和正则表达式提取 HTML 注释中的文本

Python3爬虫——用Xpath提取网页信息