@dani1a

Не работает simple_html_dom, а именно поиск тегов. В чем проблема?

Есть тестовый код
require_once ('simple_html_dom.php');
$html=file_get_html('http://ya.ru'); 
$ret = $html->find('.content a');
echo $ret[0]->href;


Но ничего не возвращает да и вообще $ret возвращается пустым массивом. Если в методе find указать $html->find('a'); будет все тоже самое. Если пытаться парсить не страницу, а просто хтмл текст передать в переменную, тогда класс находи только первую ссылку, и все. А с страницами вообще работать не хочет. При этом в $html передается обьект, функция file_get_contents используемая в классе на сервере работает. Подскажите в чем может быть еще проблема?
  • Вопрос задан
  • 5515 просмотров
Решения вопроса 1
@dani1a Автор вопроса
Ваш вариант почему-то только все что в <head></head> выдает. Какой бы сайт не подставлял

Вопрос решился, simple_html_dom требует mbstring.func_overload 0
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Для начала попробуйте вставить проверку в скрипт на доступность страницы добавить функцию
function get_http_response_code($url) {
    $headers = get_headers($url);
    sleep(2);
    return substr($headers[0], 9, 3);
}

file_get_html переделать следующим образом
function file_get_html($url, $use_include_path = false, $context = null, $offset = -1, $maxLen = -1, $lowercase = true, $forceTagsClosed = true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN = true, $defaultBRText = DEFAULT_BR_TEXT, $defaultSpanText = DEFAULT_SPAN_TEXT) {
    // We DO force the tags to be terminated.
    $dom = new SimpleHtmlDom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
    // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
    $errorsCode = ['404', '301', '302', '502'];
    $responce = get_http_response_code($url);
    if (!in_array($responce, $errorsCode)) {
        $contents = file_get_contents($url, $use_include_path, $context, $offset);
    } else {
        return false;
    }
    
    // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
    //$contents = retrieve_url_contents($url);
    if (empty($contents) || strlen($contents) > MAX_FILE_SIZE) {
        return false;
    }
    // The second parameter can force the selectors to all be lowercase.
    $dom->load($contents, $lowercase, $stripRN);
    return $dom;
}

И для начало просто проверить получает ли скрипт страницу
require_once ('simple_html_dom.php');
$html=file_get_html('http://ya.ru'); 
echo $html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы