Ответ 1
Получите внутреннее содержимое тегов с помощью xpath-expressen, затем используйте trim() (при условии, что вы используете php) или какую-то эквивалентную функцию, чтобы вырезать пробелы в начале или в конце.
У меня есть этот HTML:
<tr class="even expanded first>
<td class="score-time status">
<a href="/matches/2012/08/02/europe/uefa-cup/">
16 : 00
</a>
</td>
</tr>
Я хочу извлечь строку (16: 00) без лишних пробелов. Возможно ли это?
Получите внутреннее содержимое тегов с помощью xpath-expressen, затем используйте trim() (при условии, что вы используете php) или какую-то эквивалентную функцию, чтобы вырезать пробелы в начале или в конце.
I. Используйте это одно выражение XPath:
translate(normalize-space(/tr/td/a), ' ', '')
Объяснение
normalize-space()
создает новую строку из своего аргумента, в которой любой ведущий или конечный белый -пространство (пробел, табуляция, символы NL или CR) удаляется, и любое промежуточное белое пространство заменяется одним пробелом.
translate()
принимает результат, созданный normalize-space()
, и создает новую строку, в которой каждое из оставшихся промежуточных пространств заменяется пустой строкой.
II. В качестве альтернативы
translate(/tr/td/a, ' 	 
', '')
Пожалуйста, попробуйте следующее выражение xpath:
//td[@class='score-time status']/a[normalize-space() = '16 : 00']
вы можете проверить, нет ли узлов text().
/путь/текст() [нет (. = '')]
это может быть полезно с такими осями, как следующий-брат: если они не являются контейнерами или с дочерним::.
ПРИМЕЧАНИЕ. В некоторых комментариях говорится, что xpath не может выполнять строковые манипуляции... даже если он не предназначен для этого, вы можете делать основные вещи: contains(), starts-with(), replace().
если вы хотите проверить узлы с узлами, это намного сложнее, поскольку у вас обычно будет набор результатов нодлиста, а большинство функций xpath, например match или replace, будут работать только с одним node.
Таким образом, вы можете использовать xpath для извлечения контейнера или списка текстовых узлов, а затем обработать его другим языком. (например, java, php, python, perl).
Я наткнулся на эту тему, когда у меня возникла собственная проблема, аналогичная описанной выше.
HTML
<div class="d-flex">
<h4 class="flex-auto min-width-0 pr-2 pb-1 commit-title">
<a href="/nsomar/OAStackView/releases/tag/1.0.1">
1.0.1
</a>
Команда запуска XPath
tree.xpath('//div[@class="d-flex"]/h4/a/text()')
Однако этот случайный пробел захватил и дал мне вывод:
['\n ', '\n 1.0.1\n ']
Используя normalize-space, он удалил первый пробел и оставил мне то, что я хотел
tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')
['\n 1.0.1\n ']
Затем я мог бы взять первый элемент списка и использовать strip(), чтобы удалить любые дальнейшие пробелы.
Последняя команда XPath
tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')[0].strip()
Что оставило меня именно с тем, что мне требовалось:
1.0.1