Парсинг html-сайтов с помощью PHP

Парсер можно написать самому :парсер php

или использовать уже готовые библиотеки.

Библиотеки для парсинга.

  1. PHP Simple HTML DOM Parser. Подробная документация, множество функций, простота использования. Начать изучение парсинга на PHP новичкам рекомендуется именно с неё.
  2. PHPQuery. Эффективный парсинг, использующий jQuery.
  3. Zend_DOM_Query. Поскольку библиотека разработана как модуль к Zend Framework, то она идеально подойдёт прежде всего разработчикам проектов на данной CMF.
  4. Nokogiri. Компактная библиотека в полторы сотни строк, не уступающая по мощности вышеперечисленным аналогам.

 

PHP Simple HTML DOM Parser – библиотека функций парсинга для PHP, разработанная неким S.C. Chen@.

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

В числе плюсов — отсутствие проблем с кодировками. Часто бывает, что получив содержимое страницы с помощью, например, file_get_contents, кодировку данных на промежуточном этапе приходится преобразовывать. Здесь же такой надобности у меня пока что не возникало.

PHP Simple HTML DOM Parser – скачать

С помощью этой библиотеки вы можете обращаться к элементам и атрибутам элементов, искать определенного уровня вложенные элементы, фильтровать их, искать текст и комментарии(!).

Приведу примеры из документации:

// Найти ссылки и возвратить массив найденных объектов
$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().

Вот так будет выглядеть код с использованием 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>';

Еще селекторы

Ниже приведены другие примеры селекторов. Если вы использовали jQuery, то в библиотеке simple html dom синтаксис немножко схожий.

// получить первый элемент с id=“foo”   
$single = $html->find(‘#foo’, 0);
// получает при парсинге все элементы с классом class=“foo”   
$collection = $html->find(‘.foo’);
// получает все теги <a> при парсинге htmlдокумента  
$collection = $html->find(‘a’);
// получает все теги <a>, которые помещены в тег <h1>
$collection = $html->find(‘h1 a’);
// получает все изображения с title=‘himom’   
$collection = $html->find(‘img[title=himom]’);

акже вы можете производить поиск по наличию атрибутов у искомого элемента. Пример:

//Найдём все изображения с шириной 300
$seo->find('img[width=300px]');
//Найдём изображения, у которых задана ширина
$seo->find('img[width]');
//Поиск по наличию нескольких классов
$seo->find('img[class=class1 class2]');//<img class="aclass1 class2"/>
//Ищем несколько тегов вместе
$seo->find('div, span, img, a');
//Поиск по вложенности.
//В div ищем все спаны, а в спанах ссылки
$html->find('div span a');

5 комментариев

  1. Добрый день!

    Меня зовут Фомичев Георгий.
    Я являюсь основателем Endurance. Мы делаем роботов и чатботов.

    Мне интересна тема парсинга сайта с целью получения той информации, которая нам нужна.
    Скажите пожалуйста, есть ли у Вас API?
    для нашего бота:
    old.endurancerobots.com/pogovorite-s-nashim-chatbotom/

    В идеале мы хотели бы
    передавать Вам запрос HTTP / JSON, например, “что такое квант”
    и передавать ссылку “https://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%BD%D1%82 ”

    и получать обратно текстовые блоки где найдена та или иная информация (в идеале с учетом синонимов)
    Также вопрос, есть ли какие либо дополнительные параметры, которые можно вводить и регулировать при парсинге?

    С Уважением, Фомичев Георгий
    Основатель Endurance

    1. Смотрел вашего бота. На ближайший месяц, мало времени, что бы заняться только вашим проектом. Но тема интересная, я взял на заметку. Отпишусь когда смогу.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *