XPath / / div[contains (text (), 'string')] не удается выбрать divs, содержащие 'string'
- Это HTML код:
<div> <span></span> Elangovan </div>
Я хочу написать XPath для div
на основе содержащихся в тексте. Я пытался!--4-->
//div[contains(text(),'Elangovan')]
но это не работает.
3 ответов
заменить text()
С string()
:
//div[contains(string(), "Elangovan")]
или, вы можете проверить, что span
следующий текст брата содержит текст:
//div[contains(span/following-sibling::text(), "Elangovan")]
Смотрите также:
в качестве альтернативы правильному ответу alecxe (+1), следующий немного более простой и несколько более идиоматический XPath будет работать так же:
//div[contains(., "Elangovan")]
причина, по которой ваш оригинальный XPath с text()
не работает это text()
выделит все дочерние элементы текстового узла div
. Однако,contains()
ожидает строку в своем первом аргументе, и когда задан набор узлов текстовых узлов,он использует только первый. Здесь первый текстовый узел содержит пробелы, а не искомую строку, поэтому тест завершается неудачно. С неявным .
или явное string()
первый аргумент, все потомки текстового узла объединяются вместе перед выполнением contains()
тест, так тест проходит.
чтобы сделать уже хороший ответ @kjhughes немного более точным, то, что вы действительно просите, - это способ поиска подстрок в div
' s string-value:
для каждого типа узла существует способ определения строкового значения для узла такого типа. Для некоторых типов узлов строковое значение часть узла; для других типов узла строковое значение вычисляется из строкового значения descendant узлы.
оба узла контекста (.
или div
себя) и набор узлов, возвращаемых text()
- или любой другой аргумент! -- сначала преобразуются в строки при передаче в contains
. Просто они преобразуются по-разному, потому что один относится к одному элементу, а другой-к набору узлов.
строковое значение одного элемента является конкатенацией строковых значений всех его потомков текстовых узлов. Узел-набор строк-значение, с другой стороны, является строковым значением узла в наборе, который является первым в порядке документа.
таким образом, реальная разница заключается в том, что вы конвертируете в строку и как это преобразование происходит.