Simple html dom нет элемента

Учимся парсить сайты с библиотекой PHP Simple HTML DOM Parser

Те, кто хоть раз писал парсер, знает, что не стоит этого делать с помощью регулярных выражений. Проиллюстрировать это утверждение поможет следующий пример.

К примеру, из него нам нужно получить описание и url сайта. Если брать исключительно этот кусок кода, то все решается достаточно просто:

echo ‘url:’ . $list [1]. ‘,title:’ . $list [2]. $list [3]; // выведет url:http://xdan.ru,title:Сайт по программированию парсеров и многое другое

Проблемы начинаются тогда, когда описание сайта заполняют пользователи, и оно не имеет определенного шаблона.

Такой код регулярному выражению не по зубам.

Обычно, в вузах на этот случай учат писать конечный автомат. Суть его в том, что мы перебираем, посимвольно, весь html текст, находим начало тега, и строим дерево документа. Так называемое DOM (Document Object Model)

Сейчас, писать такое самому нет необходимости.

В php, начиная с версии 5, есть встроенные методы работы с деревом документа (класс DOMDocument), но основан он на XML парсере.

А HTML и XML это хоть и очень похожие, но в тоже время абсолютно разные технологии.

К примеру, непременное требование к XML это закрытые теги и отсутствие ошибок.

Отсюда вытекает условие: ошибок в html, который мы парсим с помощью нативных средств php, быть не должно.

К сожалению, на сайтах донорах, ошибки не редки, а значит этот метод отпадает.

Для корректного разбора таких сайтов, на помощь придут php библиотеки PHPQuery, Simple HTML DOM, Zend DOM Query, Nokogiri .

Некоторые из них, после небольших манипуляций скармливают html тому же DOMDocument. Мы не будем их рассматривать.

В этой статье я расскажу про SimpleHTMLDOM. Этой библиотекой я пользуюсь уже несколько лет, и она меня еще ни разу не подводила.

Скачиваем последнюю версию здесь.

Пусть Вас не смущает то, что она не обновлялась с 2008 года, то, что она умеет, полностью покроет Ваши нужды в разборе html текстов.

В архиве, который вы скачали, две папки (примеры работы и документация) и файл simple_html_dom.php.

simple_html_dom.php это и есть вся библиотека, больше ничего для работы не потребуется. Кидаем этот файл в папку с проектом и в своем скрипте просто подгружаем его.

Кроме документации, которую вы скачали с архивом, доступна еще online версия, ее вы найдете здесь

Файл подключен и готов к работе.

Для того, чтобы начать разбирать HTML, его сперва нужно получить. Обычно, я делаю это при помощи библиотеки CURL.

В simplehtmldom есть методы для удаленной загрузки страниц. После подключения файла библиотеки, нам доступны 2 функции для обработки HTML строк.

str_get_htm(str) и file_get_html(url)

Они делают одно и тоже, преобразуют HTML текст в DOM дерево, различаются лишь источники.

str_get_htm – на вход получает обычную строку, т.е. если вы получили HTML прибегнув к curl, или file_get_contents то вы просто передаете полученный текст этой функции.

file_get_html – сама умеет загружать данные с удаленного URL или из локального файла

Источник

Почему Simple HTML DOM не находит отдельные объекты?

Необходимо достать div который хранится в li с class list-items.
Однако получается так, что далеко не все данные отображаются на странице. Код выглядит следующим образом:

require_once 'simple_html_dom.php'; $base = 'http://superdeals.aliexpress.com/en?spm=2114.11010108.21.1.v65LIL'; $curl = curl_init(); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_URL, $base); curl_setopt($curl, CURLOPT_REFERER, $base); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $str = curl_exec($curl); curl_close($curl); $html = new simple_html_dom(); $html->load($str); $res=$html->find('div.pro-msg', 0)->outertext; echo $res;

То есть Simple HTML DOM даже не видит отдельные части страницы, исполнение кода = пустой странице, ставлю дургой div — все работает. Если парсить всю страницу file_get_html, то естественным образом отображается далеко не весь сайт. Подскажите пожалуйста как можно обойти проблему.

phantomjs

Ладно, помогу тебе, а то будешь всю жизнь ajax парсить регулярками 🙂
1. Создай пустую папку ali
2. Скачай туда композер https://getcomposer.org/composer.phar
3. Cоздай файл composer.json с таким содержимым

getMessageFactory()->createRequest('http://superdeals.aliexpress.com/en?spm=2114.11010108.21.1.v65LIL', 'GET'); $response = $client->getMessageFactory()->createResponse(); $client->send($request, $response); $html = $response->getContent(); $crawler = new \Symfony\Component\DomCrawler\Crawler($html); $div = $crawler->filter('div.pro-msg'); if($div) < echo $div->first()->text(); >
/usr/local/bin/php /Users/evgenij/projects/untitled/index.php Today Only Boy's Coat > Synthetic leather> Motor jacket style> Available in black and red share: vk pinterest facebook Twinner Google+ Email Sign in and share the website for a chance to get Points, which you can then convert to coupons. US $9.74 US $32.48 / piece | 70% Off 0486Left Buy Now Process finished with exit code 0

Источник

Simple html dom нет элемента

Q: Element not found in such case: $html->find(‘div[style=padding: 0px 2px;] span[class=rf]’);

A: If there is blank in selectors, quote it! $html->find(‘div[style=»padding: 0px 2px;»] span[class=rf]’);

Problem with hosting

Q: On my local server everything works fine, but when I put it on my esternal server it doesn’t work.

A: The «file_get_dom» function is a wrapper of «file_get_contents» function, you must set «allow_url_fopen» as TRUE in «php.ini» to allow accessing files via HTTP or FTP. However, some hosting venders disabled PHP’s «allow_url_fopen» flag for security issues. PHP provides excellent support for «curl» library to do the same job, Use curl to get the page, then call «str_get_dom» to create DOM object.

$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, ‘http://. ‘); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10); $str = curl_exec($curl); curl_close($curl);

Behind a proxy

Q: My server is behind a Proxy and i can’t use file_get_contents b/c it returns a unauthorized error.

A: Thanks for Shaggy to provide the solution:

// Define a context for HTTP. $context = array ( ‘http’ => array ( ‘proxy’ => ‘addresseproxy:portproxy’, // This needs to be the server and the port of the NTLM Authentication Proxy Server. ‘request_fulluri’ => true, ), );

$html= file_get_html(‘http://www.php.net’, false, $context); .

Memory leak

Q: This script is leaking memory seriously. After it finished running, it’s not cleaning up dom object properly from memory..

A: Due to php5 circular references memory leak, after creating DOM object, you must call $dom->clear() to free memory if call file_get_dom() more then once.

$html = file_get_html(. ); // do something. $html->clear(); unset($html);

Источник

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

Но ничего не возвращает да и вообще $ret возвращается пустым массивом. Если в методе find указать $html->find(‘a’); будет все тоже самое. Если пытаться парсить не страницу, а просто хтмл текст передать в переменную, тогда класс находи только первую ссылку, и все. А с страницами вообще работать не хочет. При этом в $html передается обьект, функция file_get_contents используемая в классе на сервере работает. Подскажите в чем может быть еще проблема?

Ваш вариант почему-то только все что в выдает. Какой бы сайт не подставлял

Вопрос решился, simple_html_dom требует mbstring.func_overload 0

finethanks

function get_http_response_code($url)
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

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

Как правильно настроить Server-Sent Events в PHP?

Источник

Читайте также:  Html text vertical display
Оцените статью