【问题标题】:Weird error using PHP Simple HTML DOM parser使用 PHP Simple HTML DOM 解析器的奇怪错误
【发布时间】:2011-10-13 12:23:33
【问题描述】:

我正在使用这个库(PHP Simple HTML DOM parser)来解析链接,代码如下:

function getSemanticRelevantKeywords($keyword){
    $results = array();
    $html = file_get_html("http://www.semager.de/api/keyword.php?q=". urlencode($keyword) ."&lang=de&out=html&count=2&threshold=");
    foreach($html->find('span') as $e){
            $results[] = $e->plaintext;
    }
    return $results;
}

但是当我输出结果时出现这个错误:

致命错误:在非对象上调用成员函数 find() /var/www/vhosts/e着名的.de/subdomains/sandbox/httpdocs/getNewTrusts.php 第 25 行

(第 25 行是 foreach 循环),奇怪的是它正确地输出了所有内容(至少看起来如此),但我仍然收到该错误并且无法弄清楚原因。

【问题讨论】:

标签: php html-parsing


【解决方案1】:

这个错误的原因是:如果来自 url 的响应的大小大于 600000,简单的 HTML DOM 不会返回对象。
您可以通过更改simple_html_dom.php 文件来取消它。从file_get_html 函数的if 条件中删除strlen($contents) > MAX_FILE_SIZE
这将解决您的问题。

【讨论】:

  • 为我工作!谢谢!.. @Krumia,我同意答案必须以专业的方式格式化。但是,如果接电话的人很忙,很忙,只有几分钟的时间来接电话,它仍然可以达到目的。
【解决方案2】:

你只需要在simple_html_dom.php文件中增加CONSTANT MAX_FILE_SIZE

例如:

define('MAX_FILE_SIZE', 999999999999999);

【讨论】:

    【解决方案3】:

    这个错误通常意味着 $html 不是一个对象。

    你说这似乎可行,这很奇怪。如果你输出 $html 会发生什么? 我想该 url 不可用并且 $html 为空。

    编辑: 看起来这可能是解析器中的错误。有人提交了bug 并在他的代码中添加了一个检查作为解决方法。

    【讨论】:

    • 如果我输出 $html 我得到: simple_html_dom Object ( [root] => simple_html_dom_node Object ( [nodetype] => 5 [tag] => root [attr] => Array ( ) [children] => Array ( [0] => simple_html_dom_node Object ( [nodetype] => 1 [tag] => div [attr] => Array ( [class] => tagcloud ) [children] => Array ( [0] => simple_html_dom_node Object ( [nodetype] => 1 [tag] => span [attr] => Array ( [style] => font-size:100%; ) [children] => Array ( ) [nodes] => Array ( [0] => simple_html_dom_node Object...etc 然后在数组的末尾(使用 print_r() 显示),我得到: [noise:protected] => Array ( ) ) 1
    • @Luis Armando 添加了更多信息。似乎这可能是解析器的错误。
    • 嗨 Luis,你是如何解决这个问题的?当我使用 PHP Simple HTML DOM 解析器时出现同样的错误
    【解决方案4】:

    file_get_html/load_file方法之前,你应该先检查URL是否存在。

    如果 URL 存在,则通过一个步骤。
    (某些服务器为 404 页面提供有效的 HTML 页面。它具有适当的 HTML 页面结构,如正文、头部等。但它只有文本“此页面无法'!找不到。404 错误 bla bla ..)

    如果 URL 是 200-OK,那么你应该检查获取的东西是否是对象,是否设置了节点。

    这是我在页面中使用的代码。

    function url_exists($url){
        if ((strpos($url, "http")) === false) $url = "http://" . $url;
        $headers = @get_headers($url);
        // print_r($headers);
        if (is_array($headers)){
            if(strpos($headers[0], '404 Not Found'))
                return false;
            else
                return true;    
        }         
        else
            return false;
    }
    
    $pageAddress='http://www.google.com';
    if ( url_exists($pageAddress) ) {
        $htmlPage->load_file( $pageAddress );
    } else {
        echo 'url doesn t exist, i stop';
        return;
    }
    
    if( $htmlPage && is_object($htmlPage) && isset($htmlPage->nodes) )
    {
        // do your work here...
    } else {
        echo 'fetched page is not ok, i stop';
        return;
    }
    

    【讨论】:

      【解决方案5】:

      对于那些通过搜索引擎到达这里的人(就像我所做的那样),在阅读了上面的信息(和链接的错误报告)之后,我开始了一些代码提示,并最终在加载 dom 后通过 2 次额外检查来解决我的问题;

      $html = file_get_html('<your url here>');
      // first check if $html->find exists
      if (method_exists($html,"find")) {
           // then check if the html element exists to avoid trying to parse non-html
           if ($html->find('html')) {
                // and only then start searching (and manipulating) the dom 
           }
      }
      

      【讨论】:

      • 我收到method_exists($html,"find") == true 但仍然出现错误“调用非对象上的成员函数 find()”
      【解决方案6】:

      我的日志中出现了同样的错误,除了上述解决方案之外,也可能是文档中没有“跨度”。搜索具有页面上不存在的特定类的 div 时出现相同的错误,但是当搜索我知道页面上存在的内容时,该错误不会弹出。

      【讨论】:

        【解决方案7】:

        你的脚本没问题。 当它在该页面上找不到我要查找的元素时,我会收到此错误。

        在您的情况下,请检查您正在访问的页面是否具有“SPAN”元素

        【讨论】:

          【解决方案8】:

          解决这个问题的最简单方法

          if ($html = file_get_html("http://www.semager.de/api/keyword.php?q=". urlencode($keyword) ."&lang=de&out=html&count=2&threshold=") {
          
          } else {
              // do something else because couldn't find html
          }
          

          【讨论】:

            【解决方案9】:

            错误意味着 find() 函数尚未定义或不可用。请确保您已加载或包含相关功能。

            【讨论】:

            • 如果在$html = file_get_html("http://www.semager.de/api/keyword.php?q=". urlencode($keyword) ."&amp;lang=de&amp;out=html&amp;count=2&amp;threshold="); 之后转储var_dump($html); 会产生什么输出?
            • object(simple_html_dom)#1 (21) { ["root"]=> object(simple_html_dom_node)#2 (9) { ["nodetype"]=> int(5) ["tag" ]=> string(4) "root" ["attr"]=> array(0) { } ["children"]=> array(1) { [0]=> object(simple_html_dom_node)#3 (9) { ["nodetype"]=> int(1) ["tag"]=> string(3) "div" ["attr"]=> array(1) { ["class"]=> string(8) "tagcloud " } ["children"]=> array(2) { [0]=> object(simple_html_dom_node)#5 (9)...等
            • 您运行的 PHP 版本是什么? phpinfo()
            • 我以为你的PHP版本可能没有更新,因为上面的PHP5存在对象迭代。嗯,这听起来像是那个类的小错误。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-18
            • 1970-01-01
            • 2018-02-23
            • 1970-01-01
            • 2019-03-08
            相关资源
            最近更新 更多