使用PHP简单HTML DOM解析器时出现奇怪错误
我使用这个库PHP Simple 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
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必须以专业的方式格式化。但是,如果回答的人很忙,而且很忙,只有几分钟的时间来回答,那么它仍然可以起到作用。