Парсинг HTML на PHP

Рубрика: Новости -> Скрипты -> php
Воскресенье, 27 сентября 2009 г.
Просмотров: 34269
Подписаться на комментарии по RSS

возможности PHP для создания парсеров сейчас расскажу об одном из способов парсинга html (он подойдет и для xml тоже, кстати).

Лучше ли парсить html регулярными выражениями или использовать для этих целей

возможности PHP DOM,

является холиваром. Все зависит от сложности структуры данных. Ведь если структура достаточно сложная, то с помощью регулярок приходится парсить в несколько этапов: сначала выделить большой кусок, потом разделить его на более маленькие и т.д.. В итоге, если данные сложные (или их очень много), то процесс парсинга может значительно затянуться. Ресурсоемкость в этом случае еще будет зависеть, конечно же, от самих регулярных выражений. Если в регэкспах много ".*" (они являются самыми ресурсоемкими, т.к. "прочесывают" исходный код с максимальной

жадностью), то замедление будет заметным.

И вот как раз в этом-то случае как нельзя кстати приходится PHP DOM. Это удобный

инструмент для парсинга как XML, так и HTML. Некоторые придерживаются мнения, что парсить html регэкспами вообще нельзя, и яростно защищают PHP DOM.

Пиример скрипта наглядно показывающий, как это все легко и просто. В примере разбирается html с частью карты сайта какого то блога. Он присвоен переменной прямо внутри кода. В "боевых" же условиях исходные данные следует получать, например, через file_get_contents().

<?php
$html = '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<head>
<title>Parsing-and-i.blogspot.com Map</title>
</head>
<body>
<h2>Последние темы блога</h2>
<!-- на 09.08.2009 -->
<table border="0">
   <tbody>
      <tr>
         <td><a href="http://parsing-and-i.blogspot.com/2009/08/blog-post_06.html" title="Базы">http://parsing-and-i.blogspot.com/2009/08/blog-post_06.html</a></td>
         <td>Базы</td>
      </tr>
      <tr>
         <td><a href="http://parsing-and-i.blogspot.com/2009/08/mysql-delphi-express.html" title="MySQL и Delphi. Express-метод">http://parsing-and-i.blogspot.com/2009/08/mysql-delphi-express.html</a></td>
         <td>MySQL и Delphi. Express-метод</td>
      </tr>
      <tr>
         <td><a href="http://parsing-and-i.blogspot.com/2009/08/blog-post.html" title="Пост о том, что лучше сто раз проверить">http://parsing-and-i.blogspot.com/2009/08/blog-post.html</a></td>
         <td>Пост о том, что лучше сто раз проверить</td>
      </tr>
   </tbody>
</table>
</body>
</html>
';
    /** создаем новый dom-объект **/
    $dom = new domDocument;
    /** загружаем html в объект **/
    $dom->loadHTML($html);
    $dom->preserveWhiteSpace = false;
    /** элемент по тэгу **/
    $tables = $dom->getElementsByTagName('table');
    /** получаем все строки таблицы **/
    $rows = $tables->item(0)->getElementsByTagName('tr');
    /** цикл по строкам **/
    foreach ($rows as $row)
    {
        /** все ячейки по тэгу **/
        $cols = $row->getElementsByTagName('td');
        /** выводим значения **/
        echo $cols->item(0)->nodeValue.'<br>';
        echo $cols->item(1)->nodeValue.'<br>';
        echo '<hr>';
    }
?>

В результате после запуска скрипта примера получаем такую картину:

Parsing html with dom phpисточник

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Комментариев: 1

  1. 2012-11-19 в 11:11:31 | Дмитрий

    Интересный подход. Спасибо за идею! Хотя я применяю, в основном, регулярные выражения...

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

(войти без комментирования)

Имя и сайт используются только при регистрации

Если указать email (зарегистрироваться), то будет уведомление о новых комментариях.

Выберите человечка с поднятой рукой!