Работа с 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->preserveWhiteSpace = false; // не учитываем пробелы $xpath = new DomXPath($dom); // шаг 3 // * * * |
В результате мы имеем объект $xpath с загруженным HTML DOM деревом, к элементам которого мы можем обращаться по средствам запросов xpath.
Для получения блока погоды из загруженного документа, дополним наш код следующими строками
// * * * $pogoda= $xpath->query(".//*[@class='temp']/dd"); // шаг 4 echo $pogoda->item(0)->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
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2024 (25)
- Ноябрь 2024 (10)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Интеграция платежной системы MoonPay на сайт по API 10.11.2024
- Парсер товаров с Taobao 08.11.2024
- Упаковка и минификация кода JavaScript онлайн 07.11.2024
- Как эффективно анализировать логи при DDOS атаке 07.11.2024
- Бот для автоматических заказов на OZON (плагин для Chrome) 07.11.2024
Таблица соответствий запросов CSS и XPAth
http://seleniumforall.blogspot.ru/2012/05/css-xpath.html