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

时间:2009-11-24 18:01:27

标签: 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 ($divTag as $val) {
echo $val->getAttribute('title') . ' - ' . $val->nodeValue . "<br />\n";
}

如果页面来源(仅适用于Div)

<div id="post">Some text <img src="..." /> <table>some codes</table></div>

然后函数返回

"Some text " 

但我也希望获得所有HTML元素,例如:

Some text <img src="..." /> <table>some codes</table>

有什么办法吗?谢谢你。

3 个答案:

答案 0 :(得分:2)

如果您在浏览器DOM中查找innerHTML的DOMDocument版本,则最近的版本为saveXML

echo $dom->saveXML(val).'<br />\n';

(如果您希望实际显示为文本,请记住htmlspecialchars。)

这会给你outerHTML。如果你真的需要innerHTML,你必须遍历每个元素的子节点并将它们传递给saveXML,然后将它们内爆。

它只是XML序列化:没有相应的HTML版本。 saveHTML确实存在,但遗憾的是,它只能立刻保存整个文档。如果你得到遗留HTML很重要,你可以通过传递LIBXML_NOEMPTYTAG选项来避免它,以确保像<script src="..."></script>这样烦人的空标记不会破坏浏览器。

答案 1 :(得分:0)

尝试从Xpath Query中删除'//'...

这告诉XPath解析器然后也获取所有子节点......你的HTML标签是......

参考:http://www.w3schools.com/XPath/xpath_syntax.asp

编辑:

同时检查XPath Axes:http://www.w3schools.com/xpath/xpath_axes.asp

答案 2 :(得分:0)

基本上是什么bobince说,但我补充说你可以使用输出缓冲来获取内容,如果你在PHP中这样做而不在html中显示它。

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