Странная ошибка при использовании PHP Simple HTML DOM parser - PullRequest
9 голосов
/ 26 июля 2011

Я использую эту библиотеку (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/efamous.de/subdomains/sandbox/httpdocs/getNewTrusts.php в строке 25

(строка 25 - цикл foreach), странно то, что он выводит все (по крайней мере, на первый взгляд) правильно, но я все еще получаю эту ошибку и не могу понять, почему.

Ответы [ 9 ]

21 голосов
/ 06 ноября 2014

Причина этой ошибки: простой HTML DOM не возвращает объект, если размер ответа от URL превышает 600000.
Вы можете аннулировать его, изменив файл simple_html_dom.php. Удалите strlen($contents) > MAX_FILE_SIZE из условия if функции file_get_html.
Это решит вашу проблему.

7 голосов
/ 21 января 2016

Вам просто нужно увеличить CONSTANT MAX_FILE_SIZE в файле simple_html_dom.php .

Например:

define('MAX_FILE_SIZE', 999999999999999);
3 голосов
/ 26 июля 2011

Эта ошибка обычно означает, что $ html не является объектом.

Странно, что вы говорите, что это работает.Что произойдет, если вы выведете $ html?Я полагаю, что URL-адрес недоступен и $ html имеет значение null.

Редактировать: похоже, это может быть ошибкой в ​​анализатореКто-то отправил ошибку и добавил проверку в своем коде в качестве обходного пути.

2 голосов
/ 31 мая 2012

Для тех, кто прибыл сюда через поисковую систему (как я это сделал), после прочтения информации (и связанного сообщения об ошибке) выше, я начал кое-что подталкивать к коду и в итоге исправил свои проблемы с помощью 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 
     }
}
2 голосов
/ 03 марта 2012

Перед file_get_html/load_file методом, вы должны сначала проверить, существует ли URL.

Если URL существует, вы проходите один шаг.
(Некоторые серверы обслуживают страницу 404 действительной страницей HTML., который имеет собственную структуру HTML-страницы, такую ​​как тело, голова и т. д. Но в ней есть только текст "Эта страница не может быть найдена! Ошибка 404, бла-бла ..)

Если 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;
}
0 голосов
/ 01 февраля 2017

Самое простое решение этой проблемы

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
}
0 голосов
/ 10 ноября 2016

ваш сценарий в порядке.Я получаю эту ошибку, когда не могу найти элемент, который ищу на этой странице.

В вашем случае, пожалуйста, проверьте, имеет ли страница, к которой вы обращаетесь, элемент 'SPAN'

0 голосов
/ 17 марта 2012

В моих журналах появляется та же ошибка, и кроме упомянутых выше решений, также может быть, что в документе нет «span».Я получаю ту же ошибку при поиске div с определенным классом, который не существует на странице, но при поиске того, что, как мне известно, существует на странице, ошибка не появляется.

0 голосов
/ 26 июля 2011

Ошибка означает, что функция find () либо еще не определена, либо недоступна.Убедитесь, что вы загрузили или включили соответствующую функцию.

...