• Как парсить HTML код

  • Учимся парсить сайты с библиотекой PHP Simple HTML DOM Parser

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

     Возьмем HTML код: 

    <div><a href="http://xdan.ru"><div>Сайт по программированию парсеров</div><div> и многое другое</div></a></div>

    К примеру, из него нам нужно получить описание и url сайта. Если брать исключительно этот кусок кода, то все решается достаточно просто: 

    $html = '<div><a href="http://xdan.ru"><div>Сайт по программированию парсеров</div><div> и многое другое</div></a></div>';
    preg_match('#<div><a href="/([^"]+)"><div>([^<]+)</div><div>([^<]+)</div></a></div>#U',$html,$list);
    echo 'url:'.$list[1].',title:'.$list[2].$list[3]; // выведет url:http://xdan.ru,title:Сайт по программированию парсеров и многое другое
    

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

    <div><a href=”http://xdan.ru”><div>Сайт по <b>программированию</b> парсеров</div><div> и многое <div> многое </div> другое </div></a></div>
    

    Такой код регулярному выражению не по зубам.

    Обычно, в вузах на этот случай учат писать конечный автомат. Суть его в том, что мы перебираем, посимвольно, весь html текст, находим начало тега, и строим дерево документа. Так называемое DOM (Document Object Model)

    Сейчас, писать такое самому  нет необходимости.

    В php, начиная с  версии 5, есть встроенные методы работы с деревом документа (класс DOMDocument), но основан он на XML парсере.

    А HTML и XML это хоть и очень похожие, но в тоже время абсолютно разные технологии.

    К примеру, непременное требование к XML это закрытые теги и отсутствие ошибок.

    Отсюда вытекает условие: ошибок в html, который мы парсим с помощью нативных средств php,  быть не должно.

    К сожалению, на сайтах донорах, ошибки не редки, а значит этот метод отпадает.

    Для корректного разбора таких сайтов, на помощь придут php библиотеки PHPQuery, Simple HTML DOM, Zend DOM Query, Nokogiri .

    Некоторые из них, после небольших манипуляций скармливают html  тому же DOMDocument. Мы не будем их рассматривать.

    В этой статье я расскажу про SimpleHTMLDOM. Этой библиотекой я пользуюсь уже несколько лет, и она меня еще ни разу не подводила.