Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Для чего нужен XPath в ZennoPoster?

С помощью синтаксических конструкций XPath Вы можете реализовать более универсальный и устойчивый к изменениям вёрстки сайта алгоритм обработки поиска данных в сравнении с регулярными выражениями.
Данный язык запросов позволяет значительно упростить логику парсеров и тем самым ускорить их разработку.

Тестирование запросов при их составлении

Например, чтобы получить названия мероприятий на сайте w3.org, мы можем использовать следующее выражение:

Code Block
//*[@id="w3c_home_upcoming_events"]/ul/li//a

Это и другие выражение выполняются с помощью C# кода:
FindElementByXPath Method (Tab)
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic421.html

FindElementByXPath Method (Document)
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic28.html

FindElementsByXPath Method (Tab)
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic426.html

FindElementsByXPath Method (Document)
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic33.html

FindChildrenByXPath Method
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic101.html

FindChildByXPath Method
https://help.zennolab.com/en/v5/zennoposter/5.11.7.0/webframe.html#topic96.html

Базовый синтаксис

...

Базовый синтаксис

Пути

Выражение

Описание

.

текущий контекст

.//

рекурсивный спуск (на ноль или более уровней от текущего контекста)

/html/body

...

абсолютный путь

...

a

...

относительный путь

...

//*

...

все в текущем контексте

li/*/a

...

ссылки, являющиеся «внуками» для li

//a|//button

...

ссылки и кнопки (объединение двух множеств узлов)

Отношения

Выражение

Описание

a/i/parent::p

...

непосредственный родитель

...

<p>

p/ancestor::*

...

все родители

p/following-sibling::*

...

все следующие братья

p/preceding-sibling::*

...

все предыдущие братья

p/following::*

...

все следующие элементы кроме потомков

p/preceding::*

...

все предыдущие элементы кроме предков

p/descendant-or-self::*

...

контекстный узел и все его потомки

p/ancestor-or-self::*

...

контекстный узел и все его предки

Получение узлов

Выражение

Описание

/div/text()

...

получить текстовые узлы

/div/text()[1]

...

получить первый текстовый узел

Позиция элемента

Выражение

Описание

a[1]

...

первый элемент

a[last()]

...

последний элемент

a[2]

...

вторая ссылка

...

a[position()

...

<= 3]

...

первые 3 ссылки

ul[li[1]=

...

”OK”]

...

список (UL), первый элемент которого содержит значение 'OK'

tr[position() mod 2 = 1]

...

не четные элементы

tr[position() mod 2 = 0]

...

четные элементы

p/text()[2]

...

второй текстовый узел

Атрибуты и фильтры
[] - указывает на фильтрацию элементов

Выражение

Описание

input[@type=

...

”text”]

тег <input> у которого атрибут type равен text

input[@class='OK']

...

тег <input> у которого атрибут class равен OK

p[not(@*)]

...

параграфы без атрибутов

*[@style]

...

все элементы с атрибутом style

a[. =

...

“OK”]

...

 

ссылки со значением «OK»

a/@id

...

идентификаторы ссылок

a/@*

...

все атрибуты ссылок

  • a[@id and @rel]

  • a[@id][@rel]

...

ссылки, которые содержат атрибуты id и rel

a[

...

i or b]

...

ссылки содержат элемент <i> или <b>

Функции
Базовые функции Xpath - http://www.w3.org/TR/xpath/#corelib

...

Функция

Описание

Пример

name()

Возвращает имя элемента

...

[name()='a']

...

string(val)

Получить значение атрибута

...

string(a[1]/@id)

...

substring(val, from, to)

...

Вырезать часть строки

substring(@id, 1, 6)

substring-before(val, to)

Вернуть часть строки val перед строкой to

substring-before('12-May-1998', '-') = '12'

substring-after(val, from)

...

Вернуть часть строки val после строки to

substring-after(

...

'12-May-1998', '

...

-')

...

= 'May-1998'

string-length()

Возвращает число символов в строке

...

[string-length(text()) > 5]

...

count()

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

...

concat()

...

Принимает на вход две или более строки и возвращает конкатенацию (строковое сложение) своих аргументов.

...

normalize-space() 

...

Аналог Trim

...

[normalize-space(text())='SEARCH']

...

starts-with()

...

Начинается с

[starts-with(text(), 'SEARCH')]

...

contains()

...

Содержит

[contains(name(), 'SEARCH')]

...

translate(val, from, to)

Производит замену символов первого своего строкового аргумента, которые присутствуют во втором аргументе на соответствующие символы третьего аргумента.

...

translate(«bar»,«abc»,«ABC»)

Группирование

Выражение

Описание

(table/tbody/tr)[last()]

...

последняя строка <tr> из всех таблиц

(//h1|//h2)[contains(text(), 'Text')]

...

заголовок первого или второго уровня, который содержит «Text»

...

a[//tr/@data-id=@data-id]

...

все ссылки у которых атрибут data-id совпадает с этим же атрибутом у строки таблицы

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

https://ru.wikipedia.org/wiki/XPath
https://www.w3schools.com/xml/xpath_syntax.asp