使用PHP Simple HTML DOM解析器的奇怪错误

时间:2011-07-26 15:05:53

标签: php html-parsing

我正在使用这个库(PHP Simple HTML DOM解析器)来解析链接,这里是代码:

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/efamous.de/subdomains/sandbox/httpdocs/getNewTrusts.php   第25行

(第25行是foreach循环),奇怪的是它输出了所有内容(至少看似正确),但我仍然得到了这个错误并且无法找出原因。

9 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:7)

您只需在文件 simple_html_dom.php 中增加CONSTANT MAX_FILE_SIZE即可。

例如:

define('MAX_FILE_SIZE', 999999999999999);

答案 2 :(得分:3)

此错误通常意味着$ html不是对象。

你说这似乎有用,这很奇怪。如果输出$ html会发生什么? 我想,网址不可用,$ html为空。

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

答案 3 :(得分:2)

file_get_html/load_file方法之前,您应首先检查网址是否存在。

如果网址存在,则传递一步 (有些服务器,404页面是一个有效的HTML页面。它具有主体,头部等的HTML页面结构。但它只有文本“这个页面无法找到.404错误bla bla ...”

如果URL为200-OK,那么您应检查fetched thing是否为对象以及是否设置了节点。

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

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;
}

答案 4 :(得分:2)

对于那些通过搜索引擎到达这里的人(就像我一样),在阅读了上面的信息(和链接的错误报告)之后,我开始了一些代码刺激,最后在加载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 
     }
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

解决此问题的最简单方法

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
}

答案 8 :(得分:-2)

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