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
Кроме того видна разница и в выводе результатов (кодировка):
В общем, библиотека мне нравится, кто еще не пользовался — советую попробовать.
PHP Simple HTML DOM Parser - Генератор расширений Joomla и многое другое на нашем сайте посвященном работе расширений, компонентов, модулей, плагинов для линейки Joomla. Отправляйте ссылку на страницу своим друзьям и в социальные сети воспользовавшись графическими иконками выше.