【问题标题】:PHP & xPath QuestionPHP & xPath 问题
【发布时间】:2010-10-07 14:50:02
【问题描述】:

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

编辑

实际上是的,抱歉,当我评论其他内容时,该行是为了测试...我在这里删除它仍然有错误。

【问题讨论】:

    标签: php xpath


    【解决方案1】:

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

    另外,请注意使用nodeValue 属性来获取元素的文本表示:

    $elements = $xPath->query("//*[@class='nombrecomplejo']");
    
    foreach ($elements as $e) {
      echo $e->nodeValue;
    }
    

    您收到错误的原因是您无法将字符串以外的任何内容提供给parse_str(),您尝试传入DOMElement。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        首先,从

        中删除@
        @$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. 这些对象大部分都不能转换成字符串

        因此,当您尝试将 DOMNodeList 转换为字符串时,您的代码似乎出错了,这意味着 $e 出于某种原因是 NodeList 而不是节点。

        尝试回显 $e->length 来查看您是否有特定长度的节点列表,或者迭代 $e 以找出其中的内容。您还可以添加回声“。”;到您的循环,然后计算点以确保您的 Xpath 查询返回非零长度的内容。

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

        祝你好运!

        【讨论】:

          猜你喜欢
          • 2011-02-21
          • 1970-01-01
          • 2020-10-24
          • 2010-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          相关资源
          最近更新 更多