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

Author Роман Чернышов    Category Без рубрики     Tags , Комментариев 1 Дата 2 Июн

xpath Работа с xml,html DOM деровом по средствам XPathПрежде чем описывать примеры работы, расскажу кратко о 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”

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

О блоге и авторе

Добро пожаловать на блог веб-разработчика! На протяжении многих лет, начиная с 2009 года, я занимаюсь созданием специализированных сайтов, сервисов и крупных веб-порталов. Мною было создано несколько сотен сайтов, большинство из которых работают на ПО созданном под заказ, а также на готовом ПО которое я разрабатываю на протяжении всего периода моей деятельности. Это: CMS "Совместные покупки", CMS "osRealty", CMS "Спорт прогнозы" и многое другое.

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

Поиск по блогу
Категории
Архив
Новое на сайте
Блогеры пишут
  • Роман Чернышов: Для работы капчи на PHP 5.6, замените в файле class.captcha.php строку 264 $ifunc( $this -> i [...]
  • Роман Чернышов: Схема такая: 1) На сайте есть виртуальные кошельки (далее ВК) 2) При пополнении пользователем ВК, [...]
  • Александр: Может скрипт комментариев блокирует сообщения с кодом? Или как длинный текст не проходит?
  • Александр: Пытаюсь в который раз здесь показать код, но страница обновляется, и не сообщения, ни любого оповеще [...]
  • Роман Чернышов: Лично у меня интерес к продаже ссылок пропал уже давно. Преимущество сапы, это то - что ссылки можно [...]
Портфолио Все работы


www.detskiy-mir.net
www.detskydoctor.ru
www.betelit.ru
www.all-alliance.ru
www.videogonok.ru
www.carpfishing.by
www.property-greek.com
www.domcons.ru

с 2009 года по сегодняшний день, создано более 300 сайтов...