Comments 80
А вот ещё интересная библиотека htmlSQL(https://github.com/hxseven/htmlSQL), позволяет работать с dom-элементами с помощью запроса напоминающего SQL
Например, SELECT href,title FROM a WHERE $class == «list»
href, title — вернуть атрибуты
a — в каких тегах искать
$class == «list» — аттрибут class=«list»
Например, SELECT href,title FROM a WHERE $class == «list»
href, title — вернуть атрибуты
a — в каких тегах искать
$class == «list» — аттрибут class=«list»
+1
Спасибо, добавлю в конец статьи. Если у кого-то есть еще примеры, пишите, может получиться интересная подборка.
0
DomCrawler компонент от Symfony
symfony.com/doc/current/components/dom_crawler.html
symfony.com/doc/current/components/dom_crawler.html
+1
framework.zend.com/manual/1.12/en/zend.dom.introduction.html — на самом деле jQuery использует CSS-селекторы.
+3
habrahabr.ru/post/30781/ — еще в 2008 было.
-2
Причем в использовании она пожалуй удобнее, ближе к jQuery.
Например:
Интересно было бы услышать от автора о преимуществах PHP Simple HTML DOM Parser перед phpQuery.
Например:
$pq->find('Item#id')->text();
$pq->find('Item#id')->attr('class', 'new-class');
$pq->find('Item#id')->children('.sub-item')->html();
Интересно было бы услышать от автора о преимуществах PHP Simple HTML DOM Parser перед phpQuery.
+1
Тут разница что там Pear, тут либа которая качается с каждым проектом. Зачастую это важно.
0
Автор пожалуйста упомяните в статье что file_get_contents() не лучший способ получать html со странички, он достаточно часто не работает на многих сайтах, к тому же вы не сможете получить http код, самый яркий пример когда вам выдало 404 страничку.
Можно использовать например curl. Лично я использую в простых проектах эту простую функцию: gist.github.com/Fedcomp/5383203 (возможный быдлокод)
Можно использовать например curl. Лично я использую в простых проектах эту простую функцию: gist.github.com/Fedcomp/5383203 (возможный быдлокод)
0
В PHP Simple HTML DOM Parser предусмотрели этот момент)
0
Если вы имеете ввиду file_get_html то вы не правы: i.imgur.com/Za3Pea8.png
Если вы говорите про str_get_html то я про него и говорил. Скачать через курл и передать классу в виде строки.
Возможно вы имели ввиду что то еще?
Если вы говорите про str_get_html то я про него и говорил. Скачать через курл и передать классу в виде строки.
Возможно вы имели ввиду что то еще?
0
Насчет «часто не работает на многих сайтах» не знаю, но вот в остальном эта функция хорошо настраивается: www.php.net/manual/ru/context.php
и 404-ю получить можно и даже редиректы отменить и пр. Конечно это не отменяет заслуг curl, но и так категорично говорить о file_get_contents я бы не стал.
и 404-ю получить можно и даже редиректы отменить и пр. Конечно это не отменяет заслуг curl, но и так категорично говорить о file_get_contents я бы не стал.
+3
В своём проекте использую. Не устраивала было скорость, решил сравнить на одной и той же странице:
1. simple_html_dom — 5.5 сек
2. nokogiri — 0.07 не работают выборки типа tr[id^=someid] и прочие сложные, нужные мне. Не подошло
3. ganon — 68 сек (!) — увы.
4. встроенный XML DOM не позволяет делать хоть сколько нибудь сложные выборки,
как например в simple_html_dom (
5. htmlSQL — 0.09 сек. — неплохо, но результаты выборки не являются объектами как в simple_html_dom, что критично.
Остался на simple_html_dom.
1. simple_html_dom — 5.5 сек
2. nokogiri — 0.07 не работают выборки типа tr[id^=someid] и прочие сложные, нужные мне. Не подошло
3. ganon — 68 сек (!) — увы.
4. встроенный XML DOM не позволяет делать хоть сколько нибудь сложные выборки,
как например в simple_html_dom (
$item->find('p[class=one-product-description-title] a',0)
5. htmlSQL — 0.09 сек. — неплохо, но результаты выборки не являются объектами как в simple_html_dom, что критично.
Остался на simple_html_dom.
+1
А phpQuery не тестировали?
+1
Если парсить тот же твиттер (или подобные этому задачи рассматривать) можно кешировать и скрипт по сути будет отрабарывать раз в 10-30 минут. А вот для каких то более сложных задач думаю будет заметно. Сегодня попробую потестировать все библиотеки на страничке rbc, например.
0
А какие селекторы юзаете? и как много? может дело не в парсере, а где то утечка производительности?
0
Сейчас разрабатываю вторую версию своей старой DOM библиотеки. Интересно мнение тех, кто использует альтернативные. Если будет время/возможность, посмотрите пожалуйста — работает ли моя разработка в вашем случае. Сложные и даже очень сложные селекторы есть в функционале.
Описал библиотеку и функционал подробнее ниже.
Описал библиотеку и функционал подробнее ниже.
0
встроенный XML DOM не позволяет делать хоть сколько нибудь сложные выборки
О чем это вы?
встроенный XML DOM позволяет делать выборки любой сложности и намного гибче CSS
+3
Ну вот у меня есть выборка типа: $trs = $this->dom->find('tr[id^=row]');
Разве XML DOM так может (имею в виду id^=row)?
Разве XML DOM так может (имею в виду id^=row)?
0
Конечно может, учитывая что большенство библиотек трансформируют CSS в XPATH и выполняют его.
Например используя SimpleXml это будет выглядить приблизительно так:
Например используя SimpleXml это будет выглядить приблизительно так:
$xml = simplexml_load_string($xml);
$trRow = $xml->xpath('//tr[starts-with(@id, "row")]');
+4
Ну совсем ппц. Ну откройте так любимые PHP'шниками доки и посмотрите список классов модуля. Потом почитайте зачем каждый из них нужен. Я давно уже считаю, что Хабр деградировал, но что настолько…
+1
Он может даже даже в стандартные XPath выражения добавлять свои функции.
Лучше XPath пока ни чего не видел. Активно использую его в парсере html страниц каталога товаров.
Лучше XPath пока ни чего не видел. Активно использую его в парсере html страниц каталога товаров.
+1
Говорят tidy самый быстрый (хорошо бы добавить в бенч), так как в виде Extension на C, но возможно некоторых вещей он не умеет.
0
Товарищи, вот монстр по парсингу, использую его в нескольких проектах: querypath.org/
0
однажды нужно было выдрать из буферизированного html блок с определенным классом. Описанная в посте библиотека потерпела фиаско, как и упомянутый выше querypath, справилась только, опять же, упомянутая выше phpQuery. Так что рекомендовать могу только её, остальные у меня уже доверия не вызывают
0
Есть еще моя старая библиотечка: github.com/amal/CDom
Сейчас как раз работаю над второй версией (с composer, PSR-0, переработанным парсером и прочими плюшками). Скорее всего напишу сравнительно-обзорную статью на хабре, как закончу.
- jQuery подобное API
- Автоматическое определение кодировки. Умеет читать кодировку указанную в самом html и некоторую эвристику для остальных случаев (не идеальное, но работает)
- Поддерживает XML/HTML любой степени кривизны и поврежденности (насколько вообще возможно поддерживать)
- Полная поддержка CSS3 селекторов и дополнительных «jQuery selector extensions»
- Возможности по манипуляции DOM и экспорту результата
- Умеет экспортировать HTML в текст с учетом блочных тегов, переводов строк и т.п.
- Код покрыт тестами
- Может работать также с простым BBCode и другими HTML подобными разметками
Сейчас как раз работаю над второй версией (с composer, PSR-0, переработанным парсером и прочими плюшками). Скорее всего напишу сравнительно-обзорную статью на хабре, как закончу.
+5
Кто то обьяснит, почему используются библиотеки для имуляции css, вместо более продвинутого, скоростного и нативного xpath?
+4
Для тех, кто уже знает CSS или jQuery-селекторы, XPath — это ещё один язык, который надо изучать, и который, к тому же, теряет популярность: www.google.com/trends/explore#q=xpath
-1
Ну во-первых, он очень прост — так что если вдруг кто то его не знает то лучше потратить час два на изучение
Во-вторых для PHP существует SimpleXML API которое позврляет сдельть все тоже, и так само выразительно, без внешних зависимостей
Имхо, CSS это вообще сплошное недорозумение
Во-вторых для PHP существует SimpleXML API которое позврляет сдельть все тоже, и так само выразительно, без внешних зависимостей
Имхо, CSS это вообще сплошное недорозумение
+1
Он очень легко и просто изучается. Буквально осенью привлекал фронта на написание XPath выражений для парсера каталогов. Человек не знающий что такое DOM API, не представляющий что есть XML и ни разу не видевший XPath через 2 часа уже писал первые выражения для парсера. Еще где-то часа 2 ушло на получение требуемых выражений. Конечно, это потребовало не самостоятельного изучения, а я объяснял общий концепт и ткнул в нужные места спецификации. Но человек на следующий день уже сам делал следующий парсер, а я лишь контролировал конечный результат.
Так что… я могу утверждать, что Xpath это достаточно легко осваиваемая идея.
Так что… я могу утверждать, что Xpath это достаточно легко осваиваемая идея.
+2
С XPath все отлично, но вот PHP DOM имеет ряд серьезных недостатков, как то неудобное API (собственно, как и в браузерах, из-за чего в свое время набрал популярность jQuery), плохая поддержка html (на самом деле плохая, я встречал сотни html документов, которые не мог обработать DOMDocument/SimpleXML), фактическая невозможность получить на выходе все тот же html (например выбрать конкретные узлы и получить их код ТОЧНО как в исходном документе).
0
неудобное API— дело вкуса и всегда можна сделать обертку
плохая поддержка html— с этим могу частично согласиться, так как действтельно все плохо с невалидным html. И это скорей связано с тем что все браузеры/движки разбора html востанавливали его поразному, пока не появился стандарт разбора в html5.
получить их код ТОЧНО как в исходном документе— вполне возможно, вот только интересно зачем это вам?
0
плохая поддержка html
Точного стандарта нет, но как разбирать вполне понятно. Даже хоть как нибудь было неплохо. Но как уже писал, встречал сотни html документов, которые вообще не мог обработать DOMDocument/SimpleXML. Целые куски обрабатывались некорректно, как-то корежились… в общем ад. При этом своей библиотекой или simple html dom обрабатывал спокойно.
получить их код ТОЧНО как в исходном документе
С этим встречался в очень многих задачах. XML DOM иной раз меняет исходный код достаточно сильно, «достраивая» код до валидного XML, что совершенно неприемлемо. Сделать то что-то можно при желании, но только с обертками и кучей костылей, что опять же не вариант. Нужен именно HTML DOM, причем заточенный под задачи парсера, а не рендеринга HTML (т.е. достраивать вообще что либо не нужно, надо обрабатывать как есть).
0
Уже несколько лет использую для парсинга. Очень удобно/быстро/мало кода!
xdan.ru/Uchimsya-parsit-saity-s-bibliotekoi-PHP-Simple-HTML-DOM-Parser.html не плохое описание с примерами.
xdan.ru/Uchimsya-parsit-saity-s-bibliotekoi-PHP-Simple-HTML-DOM-Parser.html не плохое описание с примерами.
0
1. Т.к. парсер целиком на PHP, то работать будет медленно и памяти будет есть заметно больше, чем какой-нибудь биндинг к libxml2.
2. Зачем-то без разрешения вырезает script, CDATA, style и ещё много информации
3. Не умеет преобразовывать HTML entities
Вывод можете сами сделать.
2. Зачем-то без разрешения вырезает script, CDATA, style и ещё много информации
php > require '/tmp/simple_html_dom.php';
php> $html = '
<html>
<body>
bodytxt1
<script>var y = a<b;</script>
<style>body {display:none}</style>
<p>I-m here</p>
bodytxt2
</body>
</html>';
php > $tree = str_get_html($html);
php > echo $tree->find("body", 0)->plaintext;
bodytxt1 I-m here bodytxt2
php >
php > echo $tree->find("body > p", 0)->plaintext;
I-m here
php >
php > echo $tree->find("body > script", 0)->plaintext;
php >
3. Не умеет преобразовывать HTML entities
php > $html = '<html><body>M&M-s, 3>2</body></html>';
php > $tree = str_get_html($html);
php > echo $tree->find("body", 0)->plaintext;
M&M-s, 3>2
php >
Вывод можете сами сделать.
0
1. libxml не даст таких хитровымудренных запросов, типа [attribute*=value] (есть такие верстальщики, использующие (почти) одинаковые классы при верстке рекламных блоков и блоков с контентом
2. Библиотека для парсинга данных — нужно ди извлекать скрипты и стили?
3. Поможет htmlspecialchars_decode
2. Библиотека для парсинга данных — нужно ди извлекать скрипты и стили?
3. Поможет htmlspecialchars_decode
-1
А как с обработкой ошибок? Мне как в том меме «Обычно я не парсю html, но если парсю, то в нем куча синтаксических ошибок». С этой стороны лучше всего себя ведут nokogiri и родной, но медленноватый и сложный Document Object Model.
+1
Юзал эту библиотеку одно время.
В ней тогда была утечка памяти — постоянно вылетала при работе в демонах.
Штатная функция очистки не помогала.
Решил проблему с помощью хака: загрузки в объект пустой строки:
$html->load('');
В ней тогда была утечка памяти — постоянно вылетала при работе в демонах.
Штатная функция очистки не помогала.
Решил проблему с помощью хака: загрузки в объект пустой строки:
$html->load('');
+1
Да, на php подобных библиотек как говна за баней, как у дурака фантиков. Поражает энергия авторов этих поделий, из-за того чтобы подфиксить что-то в открытом проекте пишут с нуля новый. Ну дай бог, раз силы есть.
+1
Потом перестают поддерживать свой проект и чтобы пофиксить баги приходится создавать новый и так далее до бесконечности, это да.
0
Программы они же как дети, ну и что, что у соседа их три, а я своих хочу :))) Ну, а раса PHP очень плодовитая…
0
> simple_html_dom.php 1742 lines (1546 with data), 54.9 kB
Oh, you must be joking.
Oh, you must be joking.
0
Для одного из проектов пробовал разные подобные библиотеки, но в итоге остановился на Simple HTML DOM Parser.
Его минусы:
1) Не очень высокая скорость работы (есть библиотеки, бьющие его наповал по этому параметру)
2) Просто жуткий код — потребовалось расширить некоторые его методы, так умом рухнуть можно, пока вникнешь в логику
Но есть один плюс, который в моем случае перевесил все: т.к. все парсится чисто своим кодом, без всяких внешних DOM-библиотек, то с его помощью можно не только парсить отдельные куски HTML-кода (что другие парсеры часто понимают, как невалидный код), но и вносить в него изменения, не ломая исходной структуры. Аналогов, которые умеют делать то же самое, но при этом в чем-то превосходят Simple HTML DOM Parser, я просто не нашел
Его минусы:
1) Не очень высокая скорость работы (есть библиотеки, бьющие его наповал по этому параметру)
2) Просто жуткий код — потребовалось расширить некоторые его методы, так умом рухнуть можно, пока вникнешь в логику
Но есть один плюс, который в моем случае перевесил все: т.к. все парсится чисто своим кодом, без всяких внешних DOM-библиотек, то с его помощью можно не только парсить отдельные куски HTML-кода (что другие парсеры часто понимают, как невалидный код), но и вносить в него изменения, не ломая исходной структуры. Аналогов, которые умеют делать то же самое, но при этом в чем-то превосходят Simple HTML DOM Parser, я просто не нашел
0
Попробуйте CDom :)
habrahabr.ru/post/176635/#comment_6137137
По крайней мере второй недостаток я в нём решил. С первым недостатком некоторые улучшения ожидаются в новой версией.
А все фичи также есть, даже больше и удобнее.
habrahabr.ru/post/176635/#comment_6137137
По крайней мере второй недостаток я в нём решил. С первым недостатком некоторые улучшения ожидаются в новой версией.
А все фичи также есть, даже больше и удобнее.
0
UFO just landed and posted this here
Мало того, при больших объемах парсинга можно натолкнуться на segmentation fault (даже с учетом переодической очистки памяти через ->clear() и unset() ). Подробней — kirugan.ru/2013/01/kak-borotsya-s-segmentation-fault-v-simple_html_dom/
0
Скажите, какая максимальная величина файла, который сможет «обработать» simple_html_dom?
Столкнулся с тем, что библиотека как бы не видит xml-файл величиной в 18 мегабайт (237425 строк).
file_get_html и str_get_html возвращают false.
На мелких файлах отрабатывает без проблем.
Ограничения памяти и времени выполнения в php позволяют спокойно пережевать этот файл.
Столкнулся с тем, что библиотека как бы не видит xml-файл величиной в 18 мегабайт (237425 строк).
file_get_html и str_get_html возвращают false.
На мелких файлах отрабатывает без проблем.
Ограничения памяти и времени выполнения в php позволяют спокойно пережевать этот файл.
0
Чуть позже выложу статью со сравнением библиотек для парсинга, постараюсь подробнее расписать на счет вашего вопроса. Пока что посмотрите обсуждение на SF
0
Здравствуйте.
Есть html код:
div class=«title» data-action=«open» data-params='test'
Как при помощи simple_html_dom получить содержимое атрибута data-params?
Логически это должно выглядеть так: $dom = $html->find('div[class=title]', 0)->data-params
Но, как вы понимаете, это не работает.
Есть html код:
div class=«title» data-action=«open» data-params='test'
Как при помощи simple_html_dom получить содержимое атрибута data-params?
Логически это должно выглядеть так: $dom = $html->find('div[class=title]', 0)->data-params
Но, как вы понимаете, это не работает.
0
UFO just landed and posted this here
Simple PHP DOM Parser — глючное говно (врожденные проблемы с выпадением в рекурсии, неспособность выдрать tbody без thead, невозможность выбрать вторую ссылку в ячейке таблицы по find('a') и так далее и тому подобное). Как оказалось в середине проекта, когда уже поздно метаться в сторону других библиотек. Имейте это ввиду, когда будете выбирать что использовать.
0
Вообще, я обещал обзор списка библиотек и возможно таки сделаю (нет смысла на самом деле, xPath — победил везде), но все уперлось именно в то, что некоторые из библиотек, перечисленных в конце статьи (в т.ч. Simple PHP DOM Parser) или умирают на больших деревьях или просто отказываются работать. На реальных проектах (где надо нечто большее, чем просто выбрать все ссылки на странице), я настоятельно рекомендую связку curl -> tidy -> xPath
Единственный минус xPath — очень капризен к DOM, зато есть встроенные отладчики чего и где угодно, куча готового кода на этих ваших гитах и т.д.
Единственный минус xPath — очень капризен к DOM, зато есть встроенные отладчики чего и где угодно, куча готового кода на этих ваших гитах и т.д.
0
Sign up to leave a comment.
PHP HTML DOM парсер с jQuery подобными селекторами