Php 回显Xpath w/Dom
我知道有人问过一些类似的问题,但我有点被困在这里了。我找不到任何好的教程来帮助我。但我想做的应该是非常基本的。假设我想抓住Stackoverflow.com上的H1“热门问题”,使用Chrome获取Xpath,我得到以下信息:Php 回显Xpath w/Dom,php,dom,xpath,curl,Php,Dom,Xpath,Curl,我知道有人问过一些类似的问题,但我有点被困在这里了。我找不到任何好的教程来帮助我。但我想做的应该是非常基本的。假设我想抓住Stackoverflow.com上的H1“热门问题”,使用Chrome获取Xpath,我得到以下信息: /*[@id=“h-top-questions”] 所以我的问题是,;我现在如何回应这一点?使用网络上的代码片段,我得到了以下结论: <?php $curl = curl_init('http://stackoverflow.com/'); curl_setopt(
/*[@id=“h-top-questions”]
所以我的问题是,;我现在如何回应这一点?使用网络上的代码片段,我得到了以下结论:
<?php
$curl = curl_init('http://stackoverflow.com/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10');
$html = curl_exec($curl);
curl_close($curl);
if (!$html) {
die("something's wrong!");
}
//var_dump(strlen($data));
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$headerh1 = $xpath->query('//*[@id="h-top-questions"]');
foreach($headerh1 as $match) {
print_r($match);
}
?>
通过查询方法的结果获得一个DOMNodeList元素。
尝试通过item($index)方法访问节点。要以这种方式查看对象的内容,需要将其转换为字符串。如果您想这样做,您可以简单地回显
/打印
它,或者将它转换为如下字符串:
$string = (string) $object;
当一个对象被转换为字符串时,PHP调用它的\uuu toString()
方法。不幸的是,DomeElement对象没有定义一个,因此当您尝试将其转换为字符串时,将出现以下错误:
可捕获的致命错误:类DomeElement的对象无法转换为
在这个特定的场景中,有一个穷人的工作环境,允许一个人在少量代码中完成这项工作,那就是使用函数将其反弹-因为simplexmlement
类确实定义了一个asXML()
方法,该方法将其转换回XML字符串。所以你可以这样做:
foreach($headerh1 as $match) {
$xml = simplexml_import_dom($match);
echo $xml->asXML();
}
但是,在此特定实例中,这将导致以下输出:
<h1 id="h-top-questions">
Top Questions
</h1>
;
首要问题
;
所以你看,有一些额外的HTML实体泄漏在那里,而不是在原始源代码中。这发生在DOM和SimpleXML之间的某个地方
为了避免这种情况,可以:
- 传递输出。这不是一个很好的选择,因为它可能会导致无效的XML/HTML输出
- 滚动您自己的函数以将DomeElement转换为字符串。这也不是一个很好的选择,因为它将非常复杂,并且您可能需要在多个级别上递归以成功检索完整的节点列表
然而,这里需要记住的一件事是,除了测试和调试之外,您所做的工作并没有太多实际的应用程序。人们永远不会真正想要输出部分文档。我想我得到了它,我更改了print\r($match)代码>到echo$match->nodeValue。“\n”代码>。现在它工作了,这就是你的意思吗?是的,唯一的区别是你通过迭代节点来获得DOMNode,而不是item($index)方法,但在这种情况下这并不重要。