我正在使用PHP和xPath爬进我拥有的网站(只是抓取html而不是进入服务器)但是我收到了这个错误:
可捕获的致命错误:类的对象 DOMNodeList无法转换为 C:\ wamp \ www \ crawler.php上的字符串 第46行
我已经尝试回应那条线,看看我得到了什么,但我会得到同样的错误,我也尝试谷歌搜索错误,但我,最后,最终在PHP文档中发现我的例子是正如php文档中那样,除了我正在使用HTML而不是XML ...所以我不知道出了什么问题......这是我的代码......
<?php
$html = file_get_contents('http://miurl.com/mipagina#0');
// create document object model
$dom = new DOMDocument();
// load html into document object model
@$dom->loadHTML($html);
// create domxpath instance
$xPath = new DOMXPath($dom);
// get all elements with a particular id and then loop through and print the href attribute
$elements = $xPath->query("//*[@class='nombrecomplejo']");
if ($elements != null) {
foreach ($elements as $e) {
echo parse_str($e);
}
}
?>
修改
其实是对不起那条线是我在评论其他东西的时候进行测试的......我删除它的时候仍然有错误。
答案 0 :(得分:10)
根据documentation,“$elements != null
”检查是不必要的。 DOMXPath::query()
将始终返回DOMNodeList
,但可能长度为零,这不会混淆foreach
循环。
另外,请注意使用nodeValue
属性来获取元素的文本表示:
$elements = $xPath->query("//*[@class='nombrecomplejo']");
foreach ($elements as $e) {
echo $e->nodeValue;
}
您遇到错误的原因是您无法将字符串以外的任何内容提供给parse_str()
,您尝试传入DOMElement
。
答案 1 :(得分:1)
只是一个疯狂的猜测,但回显$元素; 是第46行,对吗?我相信echo命令需要一些字符串或可转换为字符串,而$元素不是。尝试删除该行。
答案 2 :(得分:1)
这里没有具体的答案,只是调试提示。
首先,从
中删除@@$dom->loadHTML($html);
可能有一个警告,你在这里可能会帮助你调试问题。 loadHTML方法不能总是处理形成不良的HTML。在您发布的示例中,我得到了以下内容
PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 109 in /Users/alanstorm/Desktop/foo.php on line 7
如果您有权这样做,请安装tidy扩展程序并使用它来获取干净的文档。
另外,请确保$ html中确实存在一个字符串。由于您通过http请求页面,因此可能由于某种原因阻止了您的IP。
如果您不习惯处理完全的“硬核”面向对象接口,则DOMDocument类/对象系列可能很难处理。
这里需要记住的两件事是
DomDocument方法返回的几乎所有是一个对象
大多数这些对象无法转换为字符串
因此,当您尝试将DOMNodeList转换为字符串时,看起来您的代码错误了,这意味着由于某种原因,$ e是NodeList而不是节点。
尝试回显$ e-&gt;长度,看看你是否有一个特定长度的节点列表,或者迭代超过$ e来弄清楚其中的内容。你也可以添加一个echo'。';到你的循环,然后计算点,以确保你的Xpath查询返回一个非零长度的东西。
我的猜测是你的xpath查询在这里返回一个空节点列表。下载Firefox xPath Checker并将其用于在HTML文档上运行xpath查询。这将让您确信您拥有正确的xPath,然后您可以专注于找出PHP部分。当我使用你的示例页面/代码检查时,我得到了一个空的结果。
祝你好运!