У меня есть этот 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) без лишних пробелов. Возможно ли это?
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().
/path/text()[not(.='')]
это может быть полезно с осями типа following-sibling::, если это не контейнеры, или с child::.
ПРИМЕЧАНИЕ: в некоторых комментариях говорится, что xpath не может работать со строками... даже если он не предназначен для этого, вы можете делать базовые вещи: contains(), starts-with(), replace().
Если вы хотите проверить пробельные узлы, это гораздо сложнее, поскольку у вас обычно будет набор результатов в виде списка узлов, а большинство функций xpath, например match или replace, работают только с одним узлом.
Таким образом, вы можете использовать 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 ']
Используя нормализовать-пространство, его удалить первую пустую узла пространства, и у меня осталось только то, что я хотел
tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')
['\n 1.0.1\n ']
Тогда я мог бы захватить первый элемент списка, и использовать прокладки (), чтобы удалить любые дополнительные пробелы
Последняя команда в XPath
tree.xpath('//div[@class="d-flex"]/h4/a/text()[normalize-space()]')[0].strip()
Что у меня осталось именно то, что мне требуется:
1.0.1