Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 回显Xpath w/Dom_Php_Dom_Xpath_Curl - Fatal编程技术网

Php 回显Xpath w/Dom

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(

我知道有人问过一些类似的问题,但我有点被困在这里了。我找不到任何好的教程来帮助我。但我想做的应该是非常基本的。假设我想抓住Stackoverflow.com上的H1“热门问题”,使用Chrome获取Xpath,我得到以下信息:

/*[@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">&#13;
        Top Questions    &#13;
     </h1>

;
首要问题
;
所以你看,有一些额外的HTML实体泄漏在那里,而不是在原始源代码中。这发生在DOM和SimpleXML之间的某个地方

为了避免这种情况,可以:

  • 传递输出。这不是一个很好的选择,因为它可能会导致无效的XML/HTML输出
  • 滚动您自己的函数以将DomeElement转换为字符串。这也不是一个很好的选择,因为它将非常复杂,并且您可能需要在多个级别上递归以成功检索完整的节点列表

然而,这里需要记住的一件事是,除了测试和调试之外,您所做的工作并没有太多实际的应用程序。人们永远不会真正想要输出部分文档。

我想我得到了它,我更改了
print\r($match)
echo$match->nodeValue。“\n”。现在它工作了,这就是你的意思吗?是的,唯一的区别是你通过迭代节点来获得DOMNode,而不是item($index)方法,但在这种情况下这并不重要。