PHP Simple HTML DOM Parser

Сегодня я немного расскажу про библиотеку для парсинга HTML под названием PHP Simple HTML DOM Parser. В последнее время частенько ей пользовалась: нравятся ее возможности и простота. Скачать библиотеку можно со страницы. В комментарии к сказано:

A simple PHP HTML DOM parser written in PHP5+, supports invalid HTML, and provides a very easy way to handle HTML elements.

То есть нам обещают массу плюсов, основные из которых скорость и поддержка невалидного html-кода. Изучив документацию, можно вдохновиться на подвиги: возможности библиотеки действительно впечатляют. Кроме всего прочего - удобный, интуитивно понятный синтаксис.Еще в числе плюсов, которые я отметила, — отсутствие проблем с кодировками. Часто бывает, что, получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).Приведу примеры из документации:

// Найти ссылки и возвратить массив найденных объектов$ret = $html->find('a');// Найти (N)-ую по счету ссылку и возвратить найденный объект или null в случае, если объект не найден$ret = $html->find('a', 0);// Найти все элементы <div>, у которых id=foo$ret = $html->find('div[id=foo]'); // Найти все элементы <div>, имеющие атрибут id$ret = $html->find('div[id]');// Найти все элементы, имеющие атрибут id$ret = $html->find('[id]');

Ну и, конечно, стандарто - в библиотеку заложена возможность перемещения по списку элементов объектного дерева. Для этого используются:

$e->children( [int $index] ), $e->parent(), $e->first_child(), $e->last_child(),$e->next_sibling(), $e->prev_sibling().

Прежде чем на страницах этого блога приводить примеры парсеров, написанных с использованием этой библиотеки, я решила протестировать, насколько соответствует реальности обещанное быстродействие. Явных тормозов я за ней не замечала, но хотелось бы получить доказательство в цифрах.Для теста возьмем элементарную задачку - выведем на экран ссылки с анкорами с главной страницы Гугля. Для сравнения буду использовать работу через стандартный domDocument.Вот так будет выглядеть код с использованием Simple HTML DOM Parser:

include_once('simple_html_dom.php');// Создаем объект DOM на основе кода, полученного по ссылке$html = file_get_html('http://www.google.com/');// находим все ссылкиforeach($html->find('a') as $element)     echo $element->href .' ('. $element->innertext. ')<br>';

А вот код с использованием domDocument:

$html = file_get_contents('http://www.google.com/');// создаем новый dom-объект$dom = new domDocument;// загружаем html в объект$dom->loadHTML($html);$dom->preserveWhiteSpace = false;// элемент по тэгуforeach ($dom->getElementsByTagName('a') as $row)    echo $row->GetAttribute('href').' ('.$row->nodeValue.')<br>';

Проведя по 5 запусков каждого варианта получила среднее время выполнения скрипта:

для Simple HTML DOM - 0,8096 для domDocument - 0,7326

Тут, хотя и Simple HTML DOM проигрывает, результаты различаются не сильно. Думаю, что надо будет потом протестировать скорость на чем-нибудь более сложном, с поиском и перемещением по узлам DOM-дерева.Зато я визуально смогла оценить работу библиотеки Simple HTML DOM Parser с "невалидным" html. Если перед строкой

$dom->loadHTML($html);

не поставить "@", то при работе скрипта с domDocument вывалится куча варнингов типа:

Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: Tag nobr invalid in Entity, line: 5Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: htmlParseEntityRef: expecting ';' in Entity, line: 5

Кроме того видна разница и в выводе результатов (кодировка):

Simple HTML DOM Parser library
domDocument

В общем, библиотека мне нравится, кто еще не пользовался — советую попробовать.

 



PHP Simple HTML DOM Parser - Генератор расширений Joomla и многое другое на нашем сайте посвященном работе расширений, компонентов, модулей, плагинов для линейки Joomla. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.

Блог

Календарь приёма объявлений

Небольшой пример из повседневной практики. Организация меняет реквизиты, и они вступят в силу через  пару недель. На сайте идет приём объявлений и объявления принимаются на несколько месяцев в...

Дырка в com_content

Сегодня у товарища, сайт которого находится на старой  Joomla 1.0.3, была сильная нагрузка на сервере, просматривая логи обнаружил не вежливый запрос такого порядка: http://сайт/index2...

Лечим вирус на сайте

  Первоначальный осмотр сайта обнаружил, что у клиента закрыт доступ по фтп, что сузило круг подозреваемых уязвимостей, стало быть отверстие в какомто скрипте движка joomla. Касперский яро...

Troj/JSRedir-MH

Снова грянул гром зарежения сайтов новым вирусом  Troj/JSRedir-MH.  И так в коротко по вирусу Troj/JSRedir-MH. Вирус или троян куда интереснее чем свои предшествиники, тепер...

Доработка расширения для рассылки Send Email JK

Сегодня поделюсь немного интересной информацией для владельцев сайтов собранных ан joomla.  Рано и поздно возникает задача подписки и рассылки информации с сайта, это может быть разная постановка зада...

Привет Ie 10 регулярка

И вот и мне пришлось столкнулся с проблемами перехода на win 8 в придачу с ie 10, некоторых постоянных пользователей моих сайтов. На многих сайтах  имеющих раздел по приёму объявлений, использ...

Kunena заменяем ссылку на профиль пользователя

Всем привет, снова снова кунена, получил задание на допиливание популярного форума Kunena, сегодня потребовалось поменять ссылку на профиль пользователя. Это связано с тем, что на сайте стоит социа...

Работает на Kunena - зачем на каждой странице?

  Все у кого стоит форум kunena мешает надпись с двумя ссылкам внизу форума "Работает на Kunena". Сея надпись висит на каждой странице форма, а также страница разработчиков содержит множество вн...

Kunena избавимся от лишних quote

Для тех кто действительно делает сайт для людей, моя следующая заметка. Расскажу вам, как избавиться от лишних quote в постах на форуме kunena. У меня несколько тематических сайтов с нормальной посеща...

Kunena решаем проблему с пропажей аватаров

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

Джомлавикам

Обработка параметров расширений joomla

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

Кunena крамсаем шаблон

1. В папке \components\com_kunena\template\ваш_шаблон\ находим файл template.xml и вставляем в него такой кусок (чтобы была возможность выбора показывать это поле или нет): <param name="l...

Подключить свои классы и методы в Joomla?

Иногда случается, что набор собственных функций или библиотек нужно подключить в Joomla. Но иногда подключить их нужно так, чтобы они присутсвовали во всей системе, вне зависимо...

3 новых полезных класса в Joomla 2.5

В платформе Joomla 11.3 разработчики добавлил несколько полезных новых классов для разработчиков. Рассмотрю некоторый из них - JGrid (для построения HTML таблиц), JWebClient (для получения информац...

Репозиторий файлов на Joomla средствами Apache

Создадим две вложенные директории /files/files в корне сайта. Если вы пожелаете использовать другие имена директорий, то вам необходимо будет внести соответствующие правки в дальнейшем. ...