Php 使用DOM获取div的内容(包括子标记)

Php 使用DOM获取div的内容(包括子标记),php,dom,xpath,Php,Dom,Xpath,我使用DOM来获取div标记的内容,但并没有显示内部html部分。 功能是: $dom = new DOMDocument; libxml_use_internal_errors(true); $dom->loadHTMLFile("$url"); libxml_use_internal_errors(false); $xpath = new DOMXPath($dom); $divTag = $xpath->query('//div[@id="post"]'); foreach (

我使用DOM来获取div标记的内容,但并没有显示内部html部分。 功能是:

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile("$url");
libxml_use_internal_errors(false);
$xpath = new DOMXPath($dom);
$divTag = $xpath->query('//div[@id="post"]');
foreach ($divTag as $val) {
echo $val->getAttribute('title') . ' - ' . $val->nodeValue . "<br />\n";
}
但我也希望获得所有HTML元素,如下所示:

Some text <img src="..." /> <table>some codes</table>
一些文本一些代码

有什么办法吗?现在谢谢。

尝试从Xpath查询中删除“/”

这会告诉XPath解析器也获取所有子节点。。。你的HTML标签是什么

参考:

编辑:


还要检查XPath轴:

如果要在浏览器DOM中查找DOMDocument版本的
innerHTML
,最近的是
saveXML

echo $dom->saveXML(val).'<br />\n';
echo$dom->saveXML(val)。“
\n”;
(如果希望HTML SpecialChars实际显示为文本,请记住使用HTML SpecialChars。)

这将为您提供
outerHTML
。如果确实需要
innerHTML
,则必须循环遍历元素的每个子节点,并将它们传递给
saveXML
,然后对它们进行内爆


而且它只是XML序列化:没有相应的HTML版本
saveHTML
确实存在,但遗憾的是,它只能一次保存整个文档。如果使用传统HTML很重要,那么您可以通过传入
LIBXML\u NOEMPTYTAG
选项来确保像
这样令人讨厌的空标记不会破坏浏览器。

基本上正如bobince所说,但是我要补充的是,如果您在php中这样做而不在html中显示内容,那么您可以使用输出缓冲来获取内容

$divTag = $xpath->query('//div[@id="post"]');
ob_start();
foreach ($divTag as $val) {
   echo $dom->saveXML($val);
}
$content = ob_get_clean();

/
告诉XPath获取所有节点,无论节点在树中的何处。因此
//div[@id=“post”]
获取id=post的所有div节点。您还获得了div节点的子节点这一事实是偶然的。谢谢,您很好。。解决方案是:$dom=newdomdocument();libxml\u使用\u内部错误(true)@$dom->loadHTMLFile($url);libxml\u使用\u内部错误(false)$xpath=新的DOMXpath($dom)$divTag=$xpath->evaluate(“//div[@id=post]”)$divcontent=$divTag->item(0);echo$dom->saveXML($divcontent);从5.3.6开始,saveHTML支持一个元素参数,就像::saveXML。我缺少什么?为什么不
$content=''
$content.=$dom->saveXML($val)?OB不能再快了是的我不知道我在想什么。。。今天早些时候,当我看我昨天写的代码时,我实际上得出了相同的结论。。。有什么方法可以让我删除这篇文章吗?你可以,但你不应该。更好的答案将获得更多的选票,这是OP(和其他人)所需的全部指示。
echo $dom->saveXML(val).'<br />\n';
$divTag = $xpath->query('//div[@id="post"]');
ob_start();
foreach ($divTag as $val) {
   echo $dom->saveXML($val);
}
$content = ob_get_clean();