2009-11-24 201 views
3

我正在使用DOM获取div标签的内容,但未显示内部html部分。 功能是:使用DOM获取div(包括子标签)的内容

$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> 

有什么办法可以做到吗?现在谢谢你。

回答

2

如果你正在寻找的DOMDocum浏览器DOM中的innerHTML的版本,最近的是saveXML

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

(如果你想,要真正显示为文本记得用htmlspecialchars。)

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

而且它只是XML序列化:没有相应的HTML版本。可悲的是,saveHTML确实存在,但只能立即保存整个文档。如果重要的是获得遗留HTML,您可以通过传入LIBXML_NOEMPTYTAG选项来避开它,以确保像<script src="..."></script>这样令人讨厌的空标签不会中断浏览器。

+0

谢谢,你没事。解决方法是:$ dom = new DOMDocument(); libxml_use_internal_errors(真); @ $ dom-> loadHTMLFile( “$网址”); libxml_use_internal_errors(假); $ xpath = new DOMXpath($ dom); $ divTag = $ xpath-> evaluate(“// div [@ id = post]”); $ divcontent = $ divTag-> item(0); echo $ dom-> saveXML($ divcontent);并且它完美地工作... – Alper 2009-11-24 22:41:25

+0

自5.3.6开始,saveHTML支持一个元素参数,就像:: saveXML一样。 – 2015-02-04 18:32:44

0

尝试删除“//”从你的XPath查询......

这告诉XPath解析器随后也得到所有子节点......,你的HTML标记...

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

编辑:

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

+0

''//告诉XPath获取所有节点,无论树在哪里。因此'// div [@ id =“post”]'得到所有div节点id = post。你也得到了div节点的孩子的事实是偶然的。 – dnagirl 2009-11-24 19:00:13

0

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

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

我错过了什么?为什么不''content ='';'和'$ content。= $ dom-> saveXML($ val);'? OB不能更快。 – Rudie 2011-04-27 21:27:03

+0

是啊,我不知道我在想什么......我今天早些时候实际上得出了同样的结论,当我看着昨天写的代码时......有什么方法可以删除这篇文章吗? – matt 2011-04-28 20:17:41

+0

你可以,但你不应该。更好的答案将获得更多的选票,这是OP(和其他人)所需的全部指示。 – Rudie 2011-04-29 08:00:49