我想使用 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<br> schemes o' <span>mice</span> an' men<img src='./mouse.gif'><br>
谢谢。
【问题讨论】:
如果你尝试访问 __tostring 的魔法方法会发生什么? ..echo $matches->item(0)
?
嗨罗伯特皮特。不知道你到底是什么意思。 echo $matches->item(0)->nodeValue.toString();产生错误。 echo $matches->item(0).toString();也会产生错误。
__toString()
是一个神奇的方法,当你尝试回显和反对时它会自动调用,所以你只需要使用 echo $matches->item(0)
并且取决于 __tostring 产生的内容,可能会给你元素.检查我的帖子!
【参考方案1】:
你如何包装你的输出arround <pre>
标签echo "<pre>" . $matches->item(0)->nodeValue . "</pre>";
【讨论】:
嗨,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->item(0)
相同的实体类型 - $xPath->query( "//div" )->item(0)
返回与 $X->getElementsByTagName('div')->item(0)
相同的实体类型
这不起作用。我粘贴了上面的代码('... Xpath will be'之后的位)它只是打印出整个 HTML 文档而不是 xpath 选择的节点内容。你让它工作了吗?我还在 $xPath->query( "//div" )->item(0) 上尝试了 saveHTML() ,这产生了一个错误。
@spiderPlant0。是的,编辑没有按您需要的方式工作,我删除并留下了没有 XPath 的那些,因为它不是您要寻找的答案。
另外,我不能使用 getElementsByTagName('div') 因为我需要一个通用的 xPath 表达式(我的例子是简化的)。
$xPathDom->saveHTML($matches->item(0))
或在此代码上echo $xPathDom->saveHTML($xPathDom->getElementsByTagName('div')->item(0));
以上是关于我想使用 XPath 和 PHP 将节点的内容提取为字符串的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup 提取节点的 XPATH 或 CSS 路径