В этой статье мы рассмотрим один из примеров написания скрипта для парсинга HTML-страниц с использованием XPath на примере сайта bing.com.


Сперва определимся с тем, что такое XPath и зачем оно нужно, если есть регулярные выражения?


XPath (XML Path Language) — это язык запросов к элементам XML-подобного документа (далее для краткости просто XML).

XPath призван реализовать навигацию по DOM в XML.

Regexp — формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов.

По сути это строка-образец (шаблон), состоящая из символов и метасимволов и задающая правило поиска.

Итак, главная разница в том, что XPath специализируется на XML, а Regexp — на любом виде текста.

В: Зачем использовать XPath, если есть regexp, в котором можно сделать тоже самое?
О: Простота поддержки.

Синтаксис у regexp такой, что уже через неделю может быть проще всё переписать, чем вносить изменения,
а с XPath можно спокойно работать. И синтаксис у xpath довольно компактный,xml’ё-фобы могут быть спокойны.

Простой пример для вдохновения — получим значение атрибута «href» у, например, тега «a».

Быстро (несколько небольших страниц) пробежаться по основам XPath можно в туториале от W3Schools.

Как использовать XPath в PHP можно почитать в документации на php.net.
И в небольшом тутораильчике от IBM DeveloperWorks.

Теперь определимся с необходимым функционалом скрипта:

* Возможность указывать произвольный поисковый запрос


* Парсим только первую страницу поисковой выдачи


* Из поисковой выдачи нам нужно:


* заголовок


* ссылка


* номер в выдаче

Исходя из нашего ТЗ составляем примерный алгоритм работы скрипта:

1) Заходим на bing.com


2) Вводим поисковую фразу


3) Получаем со страницы необходимый результат

Приступим к написанию парсера поисковой выдачи http://bing.com.
Для начала, создадим базовый каркас скрипта.

В настройки добавим переменную для хранения поискового запроса.

Заходим на сайт.

Вводим поисковую фразу.

Сохраним в переменную содержимое страницы.

Настроим xpath-объект:

Теперь у объекта $xpath есть метод «query» в который мы будем передавать наше xpath-выражение.
Давайте начнём создавать xpath-выражение.
Открыв исходный код страницы с результатами поисковой выдачи увидим, что сами результаты находятся внутри тега «li».

Т.о. наше xpath-выражение выберет со страницы все поисковые результаты.

На одной странице у нас должно быть 1 или больше результатов, проверим себя:

Здесь стоит обратить внимание на ветку if, где мы сравниваем кол-во результатов xpath-поиска с нулём.
Если наше xpath-выражение ничего не нашло, то это может означать две вещи:


* Bing действительно ничего не нашёл.


* Bing что-то нашёл, но поменял вёрстку на странице, и наше xpath-выражение необходимо исправлять.

2-й пункт достаточно коварный, в таких случаях, когда xpath-выражение ничего не находит необходимо дополнительно
сверятся, чтобы удостоверится, что xpath-выражение не устарело (хотя и это не даст 100% гарантий).

В нашем случае будем сверяться с тем, что Bing пишет кол-во найденных результатов.

А если результатов по поисковому запросу нет, то:

Т.о. мы получаем такую конструкцию проверки:


— Если xpath-запрос ничего не нашёл и поисковый запрос ничего не нашёл, то на странице будет html-код с «No results found».


— Если xpath-запрос ничего не нашёл, а поисковый запрос что-то нашёл, то на странице будет html-код с «N results».

Обновим проверку результата xpath-запроса.

Если всё хорошо и что-то нашлось, то у нас в $results будет N сущностей с результатами отработки xpath-запроса.

Каждая сущность будет содержать такой HTML-код

Теперь можно приступить непосредственно к выборке интересующих нас данных.

Получаем номер в поисковой выдаче.

Получаем заголовок.

В данном случае мы в метод «query» передали вторым параметром текущий $item и в xpath-запросе не указывали «//» (т.е. искать сначала страницы).

2-й параметр означает контекст поиска для xpath-запроса, т.е. искать будем не по всей странице, а только по маленькому html-кусочку из $item.
И, наконец-то, получаем ссылку.

Вообще-то, ссылку можно было получить и без совершения дополнительного xpath-запроса, использовав результат из поиска заголовка.
Но оставим так, для наглядности.

Полезные ссылки:

Wikipedia XPatch
Wikipedia Rugular expression
W3.org XPatch
W3schools XPatch
Mozilla.org XPatch
PHP.net
Ibm.com x-xpatch
Ibm.com x-xpatchphp

Скрипт написан 28.04.2015 в Human Emulator 4.9.18 Advanced.

скачать скрипт

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

*
*

семнадцать + девятнадцать =

Required fields are marked *