XPath примеры - шпаргалка для разбора страниц

Автор: Igor Kirsanov

Примеры использования xpath из практики парсинга информации с сайтов. Приведены участки кода xpath.

 

Получить текст заголовока h1

//h1/text()

 

Получить текст заголовока с классом produnctName

//h1[@class="produnctName"]/text()

 

Получить значение определенного span по классу

//span[@class="price"]

 

Получить значение атрибута title у кнопки с классом  addtocart_button

//input[@class="addtocart_button"]/@title

 

Текст ссылки

//a/text()

 

Получить url значение атрибута href ссылки

//a/@href

 

Изображение src

//img/@src

 

Изображение сразу за определенным элементом в DOM, ось following

//h1[@class="produnctName"]//following::div/img/@src

 

Изображение в 4 div по счету

//div[4]/img/@src

 

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML.

XML имеет древовидную структуру. У элемента дерева всегда существуют потомки и предки, кроме корневого элемента, у которого предков нет, а также тупиковых элементов (листьев дерева), у которых нет потомков.

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

Функции над множествами узлов

  • * — обозначает любое имя или набор символов по указанной оси, например: * — любой дочерний узел; @* — любой атрибут.
  • $name — обращение к переменной, где name — имя переменной или параметра.
  • [] — дополнительные условия выборки или, что то же самое, предикат шага адресации. Должен содержать логическое значение. Если содержит числовое, считается что это порядковый номер узла, что эквивалентно приписыванию перед этим числом выражения «position()=»
  • {} — если применяется внутри тега другого языка (например HTML), то XSLT процессор рассматривает содержимое фигурных скобок как XPath.
  • / — определяет уровень дерева, то есть разделяет шаги адресации
  • | — объединяет результат. То есть, можно написать несколько путей разбора через знак | и в результат такого выражения войдёт всё, что будет найдено любым из этих путей.
  • node-set node()

Возвращает все узлы. Вместо этой функции часто используют заменитель '*', но, в отличие от звездочки, функция node() возвращает и текстовые узлы.

  • string text()

Возвращает набор текстовых узлов;

  • node-set current()

Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с условиями, то единственным способом дотянуться из этого условия до текущего элемента будет данная функция.

  • number position()

Возвращает позицию элемента в множестве. Корректно работает только в цикле <xsl:for-each/>

  • number last()

Возвращает номер последнего элемента в множестве. Корректно работает только в цикле <xsl:for-each/>

  • number count(node-set)

Возвращает количество элементов в node-set.

  • string name(node-set?)

Возвращает полное имя первого тега в множестве.

  • string namespace-uri(node-set?)

Возвращает ссылку на url определяющий пространство имён.

  • string local-name(node-set?)

Возвращает имя первого тега в множестве, без пространства имён.

  • node-set id(object)

Находит элемент с уникальным идентификатором

Оси — это база языка XPath. Для некоторых осей существуют сокращённые обозначения.

  • ancestor:: — Возвращает множество предков.
  • ancestor-or-self:: — Возвращает множество предков и текущий элемент.
  • attribute:: — Возвращает множество атрибутов текущего элемента. Это обращение можно заменить на «@»
  • child:: — Возвращает множество потомков на один уровень ниже. Это название сокращается полностью, то есть его можно вовсе опускать.
  • descendant:: — Возвращает полное множество потомков (то есть, как ближайших потомков, так и всех их потомков).
  • descendant-or-self:: — Возвращает полное множество потомков и текущий элемент. Выражение «/descendant-or-self::node()/» можно сокращать до «//». С помощью этой оси, например, можно вторым шагом организовать отбор элементов с любого узла, а не только с корневого: достаточно первым шагом взять всех потомков корневого. Например, путь «//span» отберёт все узлы span документа, независимо от их положения в иерархии, взглянув как на имя корневого, так и на имена всех его дочерних элементов, на всю глубину их вложенности.
  • following:: — Возвращает необработанное множество, ниже текущего элемента.
  • following-sibling:: — Возвращает множество элементов на том же уровне, следующих за текущим.
  • namespace:: — Возвращает множество, имеющее пространство имён (то есть присутствует атрибут xmlns).
  • parent:: — Возвращает предка на один уровень назад. Это обращение можно заменить на «..»
  • preceding:: — Возвращает множество обработанных элементов исключая множество предков.
  • preceding-sibling:: — Возвращает множество элементов на том же уровне, предшествующих текущему.
  • self:: — Возвращает текущий элемент. Это обращение можно заменить на «.»