#xpath
#xpath
Вопрос:
У меня есть следующий HTML
<span class="medium bold day-time-clock">
09:00
<div class="tooltip-box first-free-tip ">
<div class="tooltip-box-inner">
<span class="fa fa-clock-o"></span>
Some more text
</div>
</div>
</span>
Я хочу XPath, который получает только текст 09:00, а не еще какой-то текст, который НЕ используется text()[1]
, потому что это вызывает другие проблемы. Мой текущий XPath выглядит следующим образом
("//span[1][contains(@class, 'day-time-clock')]/text()")
Я хочу тот, который игнорирует всю эту часть HTML
<div class="tooltip-box first-free-tip ">
<div class="tooltip-box-inner">
<span class="fa fa-clock-o"></span>
Some more text
</div>
</div>
Комментарии:
1.
//span[1][contains(@class, 'day-time-clock')]/text()
не будет соответствоватьSome more text
! Обратите внимание, что/text()
может быть выбран дочерний текстовый узел только тогда, когда он"Some more text"
являетсятекстовым узлом-потомком… Можете ли вы поделиться немного более подробной информацией, поскольку на данный момент ваша проблема совершенно неясна?
Ответ №1:
Вы можете ограничить уровень descendant::
узлов с помощью position()
.
Итак, следующее выражение действительно работает:
span/descendant::node()[2 > position()]
Отрегулируйте число в предикате в соответствии с вашими потребностями, 2
это только пример. Недостатком этого подхода является то, что подсчет потомков точен только для первого дочернего элемента в нисходящем дереве.
Другой подход ограничивает оба: предков и потомков:
span/descendant::node()[3 > count(ancestor::*) and 1 > count(descendant::*)]
Здесь также вам нужно настроить числа в предикатах, чтобы получить какие-либо полезные результаты.
Ответ №2:
Используйте normalize-space()
для выбора всех узлов документа, не содержащих пробелов:
//span[contains(@class, 'day-time-clock')]/text()[normalize-space()]
Комментарии:
1. Но во втором узле есть содержимое, то есть это не узел с пробелами. Я не понимаю вашего ответа?
2. Каждый дочерний тег в текстовом узле родительского тега является разделителем для текстового узла родительского тега, при этом содержимое вложенных тегов игнорируется. Соответственно, количество текстовых узлов в теге равно n 1 , где n» — количество тегов с первого уровня вложенности. В текущем случае имеется только один непустой текстовый узел.
Ответ №3:
Я думаю (если я вас правильно понимаю), что
"..//div[contains(@class, 'tooltip-box')]/parent::span"
вы попадаете туда.