ProfiPHPProfiPHP
  1. Главная
  2. Полезное в PHP
  3. PHP парсинг с помощью Simple HTML DOM

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. Для более подробного ознакомления перейдите на страницу Мануала.

Комментарии

Антон
Спасибо большое, очень помогли. Мне нужно было правый блок скопировать из одного на другой сайт, в результате помог код:
include($_SERVER['DOCUMENT_ROOT'].'/simple_html_dom.php' );
$html = new simple_html_dom();
$html->load_file('http://mysite.com/');
$content = $html->find('#left_colum', 0 );
$content = preg_replace('/src="(http:\/\/[^\/"]+\/?)?([^"]*)"/', "src=\"http://mysite.com/\\2\"", $content);
echo '<div style="width: 200px">'.$content.'</div>';

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

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