Выбор до второго пробела / первых двух слов в тексте () - PullRequest
0 голосов
/ 29 мая 2020

Я не могу понять, как достичь следующего. Я зашел так далеко:

//*[@id="main"]/div[2]/section/div[2]/h1/span[1][starts-with(.,"IDENTIFIER")]/following::span[1]/text()

Это вернет такой ответ, как:

Foo1 Foo2 Foo3 Foo4

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

Я попытался посмотреть

substring-before(//*[@id="main"]/div[2]/section/div[2]/h1/span[1][starts-with(.,"IDENTIFIER")]/following::span[1]/text(), ' ')

To извлечь до первого пробела, однако я наткнулся на стену в том, что делаю неправильно.

Я использую xpath в паучке Scrapy. Любая помощь приветствуется

1 Ответ

0 голосов
/ 30 мая 2020

Пример с:

<table>
<td>Pierre Paul Jacques Marie Maurice Jeanne</td>
</table>

Выражение XPath:

substring(//td,1,string-length(substring-before(//td," "))+string-length(substring-before(substring-after(//td," ")," "))+1)

Вывод:

Pierre Paul

XPath работает в 3 этапа. Сначала мы получаем длину второго члена с помощью 3 функций (substring-after, substring-before и string-length). В качестве разделителя используется пробел. Затем мы получаем длину первого члена с помощью 2 функций (передняя подстрока и длина строки). В качестве разделителя используется пробел. Наконец, мы используем susbstring для извлечения того, что нам нужно. Синтаксис: fn (содержимое элемента, начальная позиция для извлечения (1), конечная позиция (длина текста1 + длина текста2) + 1 (разделитель пробелов)).

Вы можете заменить //td на ваш селектор XPath (удалите /text() в конце и попробуйте найти более короткое выражение).

...