PHP& xPath问题

时间:2009-02-14 08:18:19

标签: php xpath

我正在使用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);
    } 
}                                                   
?>

修改

其实是对不起那条线是我在评论其他东西的时候进行测试的......我删除它的时候仍然有错误。

3 个答案:

答案 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类/对象系列可能很难处理。

这里需要记住的两件事是

  1. DomDocument方法返回的几乎所有是一个对象

  2. 大多数这些对象无法转换为字符串

  3. 因此,当您尝试将DOMNodeList转换为字符串时,看起来您的代码错误了,这意味着由于某种原因,$ e是NodeList而不是节点。

    尝试回显$ e-&gt;长度,看看你是否有一个特定长度的节点列表,或者迭代超过$ e来弄清楚其中的内容。你也可以添加一个echo'。';到你的循环,然后计算点,以确保你的Xpath查询返回一个非零长度的东西。

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

    祝你好运!