ProfiPHPProfiPHP
Категория: Полезное в PHP

PHP парсинг с помощью Simple HTML DOM

Парсинг HTML документа всегда будет являться актуальной темой. Поэтому давайте разберем самый универсальный способ реализации парсера на PHP с помощью библиотеки Simple HTML DOM.

В большинстве случаев для процесса парсинга используют регулярные выражения. Но это не самый лучший способ в связи с трудоемким процессом написания и уменьшения скорости работы PHP приложения. Мы будем использовать библиотеку Simple HTML DOM, с помощью которой можно обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии.

Сайт поддержки: PHP Simple HTML DOM Parser. Ссылка на скачивания доступна в меню "Download & Documents". В архиве содержаться примеры и документация. Нам необходимо подключить файл Simple_html_dom.php, чтобы работать с функциями данной библиотеки.

Сначала необходимо создать объект для работы. Данное действие может происходить путем загрузки из текстовой строки строки либо файла, который являет собой URL адрес в интернете:
include( 'simple_html_dom.php' );
$html = new simple_html_dom( );
// Загрузка из строки:
$html->load( '<html><body><p>Hello World!</p><p>Content</p></body></html>' );
// Загрузка из файла:
$html->load_file( 'http://profiphp.ru' );
Метод Load_file работает на использовании PHP функции File_get_contents, поэтому директива Allow_url_fopen должна быть включена, иначе вы не сможете получать HTML файлы по удаленному адресу.

Если вы сразу увидите одну из ошибок:
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error...
Warning: file_get_contents(): Failed to enable crypto...
Warning: file_get_contents(): stream does not support seeking...
Warning: file_get_contents(): Failed to seek to position -1 in the stream...
Замените в файле "simple_html_dom.php" реализацию функции "file_get_contents" (для версии 1.5 — срока №75 ) на:
$contents = file_get_contents( $url, $use_include_path, stream_context_create( array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false ) ) ) );
Не будем углубляться в сущность данных ошибок, вы просто заменяете данную строку и все работает.

Для примера возьмем самый простой HTML документ:
$html_content = '
<html>
<body>
<h1>Заголовок</h1>
<p class="post">Содержимое</p>
</body>
</html>';
Создадим коллекцию (группы объектов, найденные с помощью селекторов) на тег заголовка "H1". Для этого необходимо использовать метод Find:
$html = new simple_html_dom(  );
$html->load( $html_content );
// Получаем массив заголовков:
$element = $html->find( "h1" );
echo $element[0];
Для изменения информации можно использовать атрибут Innertext:
$element[0]->innertext .= " Новый";
Выполним добавления класса для заголовка H1:
$element[0]->class = "header";
Также, мы можем вывести результат на дисплей:
echo $html->save(  );
Вот мы разобрали самый простой способ использования библиотеки Simple HTML DOM. Метод Find находит все теги в HTML коде, и сохраняет в переменной в виде массива. Атрибут Innertext вносит изменения в текст, то есть меняет все содержимое внутри указанного тега. Атрибут Class добавляет определенный класс к данному тегу. Метод Save сохраняет изменения. Результатом выполнения нашего кода будет следующий HTML документ:
<html>
<body>
<h1 class="header">Заголовок Новый</h1>
<p>Содержимое</p>
</body>
</html>
Теперь давайте разберем, как получать информацию из других селекторов. Для этого нам необходимо в методе Find указывать более конкретную информацию. Например, получить все элементы с class="post":
echo $html->find('.post' );
Для получения первого элемента с class="post", необходимо добавить его номер после указания класса. Первый элемент в массиве имеет индекс — 0:
$class = $html->find( '.post', 0 );
Поиск может осуществляться и у вложенных тегов, для этого необходимо указать более развернутую структуру поиска, например:
echo $html->find( 'html body p.post', 0 );
Поиск заголовка, описания и ключевых слов страницы осуществляется так:
$title = $html->find( "title", 0 )->innertext;
$descr = $html->find( "meta[name=description]", 0 )->attr['content'];
$keywords = $html->find( "meta[name=keywords]", 0 )->attr['content'];
В данной статье мы описали только основные понятия библиотеки Simple HTML DOM. Для более подробного ознакомления перейдите на страницу Мануала.

Добавить комментарий

Имя:
Текст комментария: