2009-02-14 84 views
4

我使用PHP和XPath爬进一个网站,我自己的(刚才抓取的HTML不会到服务器),但我得到这个错误:PHP和XPath的问题

Catchable fatal error: Object of class DOMNodeList could not be converted to string in C:\wamp\www\crawler.php on line 46

我已经尝试过呼应刚该行看到我得到什么,但我只会得到相同的错误,我也试着用google搜索错误,但我最终结束了在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); 
    } 
}             
?> 

编辑

其实是抱歉,行是为了测试时,我曾评论其他的东西...我删除了它在这里仍然有错误,但。

回答

9

根据documentation,“$elements != null”检查是不必要的。 DOMXPath::query()将始终返回DOMNodeList,虽然它可能长度为零,这不会混淆foreach循环。

另外,还要注意使用nodeValue属性来获取元素的文字表述:

$elements = $xPath->query("//*[@class='nombrecomplejo']"); 

foreach ($elements as $e) { 
    echo $e->nodeValue; 
} 

的理由让你得到的错误是,你不能喂其他什么比一个字符串parse_str(),你尝试通过DOMElement

1

只是疯狂的猜测,但echo $元素;是第46行,对吗?我相信echo命令期望的东西是一个字符串或可转换为字符串,$元素不是。尝试删除该行。

1

这里没有具体的答案,只是调试提示。

首先,从

@$dom->loadHTML($html); 

删除@这可能是因为有你在这里supressing的警告,可以帮助您调试问题。 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类/对象的系列可能会非常棘手。

你需要记住的两两件事这里

  1. 几乎一切由一个DOMDocument方法返回是一个对象

  2. 大多数这些对象不能被转换为字符串

因此,当您尝试将DOMNodeList转换为字符串时,它看起来像您的代码错误whi ch意味着$ e是一个NodeList,而不是某个节点。

尝试回显$ e->的长度,而不是查看是否有一个特定长度的节点列表,或者遍历$ e来找出里面的内容。你也可以添加一个echo'。';到你的循环,然后对点进行计数,以确保你的Xpath查询返回非零长度的东西。

我的猜测是你的xpath查询在这里返回一个空节点列表。下载Firefox xPath Checker和我们来运行您的HTML文档上的xpath查询。这会让你确信你拥有正确的xPath,然后你可以专注于搞清楚PHP部分。当我使用你的示例页面/代码进行检查时,我得到了一个空的结果。

祝你好运!