Работа с xml,html DOM деровом по средствам XPath

Author Автор: Роман Чернышов    Опубликовано: 2 июня 2013

Прежде чем описывать примеры работы, расскажу кратко о Xpath (class php DomXPath)— как говорит нам вики, это язык запросов для обращения к объектам дерева DOM, структыры xml, xtml, html документа. Близкая аналогия схожая по принципу работы с DOM, это библиотека jQuery. В Xpath аналогичным образом происходит запрос на выборку нужных нам элементов в дереве, запросы можно формировать исходя из разных критериев элементов (выборка по классам, выборка по id, по именам тегов, по прочим атрибутам). Например можно выбрать все ссылки (тег <a ..>) на странице, получив объект(массив) содержащий их, и дальше продолжить работу с ними по средствам PHP.

Для чего это можно использовать?
Думаю многие веб-мастера и программисты и сами прекрасно знаю для чего можно использовать столь замечательный инструмент, но коли все же такие вопросы задаются некоторыми читателями моего блога, отвечу: для разбора html дерева и получения из него нужных данных, заголовков, описания, изображений и прочих элементов. Например для разбора страницы при парсинге стороннего сайта(Внимание! Описание методов использования не является призывом к действиям). Часто Xpath используется для разбора данных XML полученных от стороннего сайта по средствам API, или же загруженных из файла с целью последующего импорта в БД. Примеров применения можно напридумывать на целую книгу, так что ограничусь этими и перейдем к дальнейшему разбору.

Перейдем к практике.

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

Задача: Используя xpath получить из Html Dom дерева нужный нам объект, в частности мы будем получать со страницы www.gismeteo.ru погоду на сегодняшний день.

Итак:
1. для начала, средствами PHP создадим GET запрос на получение страницы сайта
2. далее полученный HTML документ мы преобразуем в DOM дерево, по PHP средствам класса domDocument
3. и после полученное DOM дерево мы уже будем использовать в классе DomXPath

$data = file_get_contents('http://www.gismeteo.ru '); //шаг 1 	$dom = new domDocument; 	$dom--->loadHTML($data); // шаг 2
	$dom-&gt;preserveWhiteSpace = false; // не учитываем пробелы
	$xpath = new DomXPath($dom); // шаг 3
// * * *

В результате мы имеем объект $xpath с загруженным HTML DOM деревом, к элементам которого мы можем обращаться по средствам запросов xpath.

Для получения блока погоды из загруженного документа, дополним наш код следующими строками

// * * * 
	$pogoda= $xpath-&gt;query(".//*[@class='temp']/dd"); // шаг 4
	echo $pogoda-&gt;item(0)-&gt;nodeValue; // шаг 5
// * * *

Поясню, по шагам:
4. В переменную $pogoda поучаем блок с классом temp, далее получаем все содержащиеся теги(блоки) dd
5. Выводим содержимое первого тега(блока) dd на экран. Для этого используем методы item(N), где N номер элемента в списке(в нашем случае нулевой) и метод nodeValue, который выведет значения содержимого тега(блока).

Описание получилось немного запутанным, но думаю принцип понятен. Для первого знакомства этого примера вполне достаточно.

Далее приведу примеры некоторых xpath запросов, которые пригодятся вам в работе:

Обращение к блоку по его классу (это вы уже видели в примере выше)
.//*[@class=’css_class_name’]/ul/li/div/p

Обращение к блоку по его идентификатору
.//*[@id=’css_id_name’]/ul/li/div/p

Обращение к блоку по его идентификатору, получение ссылки
.//*[@id=’css_id_name’]/ul/li/div/a
Далее через PHP, полчение атрибутов ссылки, пример:
$xpath->item(0)->getAttribute(‘href’);

Обращение к блоку по названию тега
.//*/ul/li/div/p

Обращение к блоку по его классу с указанием номера нужного элемента, если их несколько (например несколько одинаковых блоков с одинаковым классом)
.//*[@class=’css_class_name’ and position()=2]/ul/li/div/p

или

.//*[@class=’css_class_name’]/ul/li/div/p[2]
Где p[2] – второй элемент в наборе для каждого узла списка /ul/li/div.

Может быть вот так:
ul/li[position() > 2] , ul/li[position() <= 2] — элементы списка начиная с 3го номера и наоборот.

Разберем из чего состоит запрос xpath
1) .// — переходим в корень DOM документа
2) * — любой элемент, группа элементов
3) /ul/li/div/p –xpath-путь до конкретного DOM элемента дерева.

Язык запросов xpath также включает в себя некоторые функции
last() — Возвращает последний элемент коллекции.
Запрос ul/li/div/p[last()] — возвратит последние параграфы для каждого узла списка «ul».
Функция first() не предусмотрена. Для доступа к первому элементу используйте индекс «1».

text() — Возвращает тестовое содержание элемента.
.//a[text() = ‘Archive’] – получаем все ссылки с текстом «Archive».

position() и mod:
position() — возвращает позицию элемента в множестве.
mod — остаток от деления.

Комбинацией данных функций можем получить:
— не четные элементы ul/li[position() mod 2 = 1]
— четные элементы: ul/li[position() mod 2 = 0]

Операции сравнения
< — логическое «меньше»
> — логическое «больше»
<= — логическое «меньше либо равно»
>= — логическое «больше либо равно»

ul/li[position() > 2] , ul/li[position() <= 2] — элементы списка начиная с 3го номера и наоборот.

Надеюсь данное краткое изложение принципов и промеров работы с библиотекой DomXPath и языком запросов для доступа к элементам DOM дерева xPath пригодиться вам. Принцип работы очень прост и позволяет вытворять просто невероятные чудеса с элементами документа. Спасибо за внимание!)

1 Comment to “Работа с xml,html DOM деровом по средствам XPath”

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

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка