使用PHP简单HTML DOM解析器时出现奇怪错误

使用PHP简单HTML DOM解析器时出现奇怪错误,php,html-parsing,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&thre

我使用这个库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循环,奇怪的是它输出的所有内容至少看起来都是正确的,但我仍然得到了这个错误,并且不知道为什么。

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

此错误通常表示$html不是对象

奇怪的是,你说这似乎有效。如果输出$html会发生什么? 我认为url不可用,$html为空

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

在使用file\u get\u html/load\u file方法之前,您应该首先检查URL是否存在

如果URL存在,则通过一个步骤。 一些服务器为404页面提供服务,并提供有效的HTML页面。它有适当的HTML页面结构,如正文、页眉等,但它只有此页面无法显示的文本!我找不到。404错误bla bla

若URL为200-OK,那个么您应该检查获取的对象是否为object,以及是否设置了节点

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

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

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

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

此错误的原因是:如果url响应的大小大于600000,则简单HTML DOM不会返回对象。 您可以通过更改simple_html_dom.php文件将其作废。从FILE_get_html函数的if条件中删除strlen$contents>MAX_FILE_SIZE。 这将解决您的问题。

您只需在FILE simple\u html\u dom.php中增加常量MAX\u FILE\u SIZE即可

例如:

define('MAX_FILE_SIZE', 999999999999999);
你的脚本还可以。 当它找不到我在该页面上寻找的元素时,我收到了这个错误


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

此问题的最简单解决方案

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
}

建议的第三方替代方案实际使用,而不是字符串解析:,以及。如果转储var_dump$html,会有什么输出;$html=file\u get之后_htmlhttp://www.semager.de/api/keyword.php?q=. urlencode$keyword.&lang=de&out=html&count=2&threshold=;?objectsimple\u html\u dom1 21{[root]=>objectsimple\u dom\u node2 9{[nodetype]=>int5[tag]=>string4 root[attr]=>array0{}[children]=>array1{[0]=>objectsimple\u html\u dom\u node3 9{[nodetype]=>int1[tag]=>string3 div[attr]=>array1{[class]=>string8 tagcloud}[children]>array2]=>objectsimple\u html\u dom\u node5 9…等等您运行的PHP版本是什么?phpinfoI认为可能您的PHP版本没有更新,因为上面的PHP5上存在对象迭代。好吧,这听起来像是该类的小错误。如果我输出$html,我会得到:simple\u html\u dom object[root]=>simple\u html\u dom\u node object[nodetype]=>5[tag]=>root[attr]=>Array[children]=>Array[0]=>simple\u html\u dom\u node Object[nodetype]=>1[tag]=>div[attr]=>Array[class]=>tagcloud[children]=>Array[0]=>simple\u html\u dom\u node Object[nodetype]=>1[tag]=>span[attr]=>Array[style]=>字体大小:100%;[children]=>Array[nodes]=>Array[nodes]=>Array[0]=>简单的\u html\u dom\u节点对象…等等,然后在使用print\r显示的数组末尾,我得到:[noise:protected]=>阵列1@LuisArmando添加了更多信息。似乎这可能是解析器的错误。嗨,Luis,你如何解决这个问题?当我使用PHP简单HTML DOM parserI get方法时,我有相同的错误。\u exists$HTML,find==true,但对非object上的成员函数find的错误调用对我来说仍然有效!谢谢!@Krumia,我同意answer必须以专业的方式格式化。但是,如果回答的人很忙,而且很忙,只有几分钟的时间来回答,那么它仍然可以起到作用。