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. Просто они преобразуются по-разному, потому что один относится к одному элементу, а другой-к набору узлов.

строковое значение одного элемента является конкатенацией строковых значений всех его потомков текстовых узлов. Узел-набор строк-значение, с другой стороны, является строковым значением узла в наборе, который является первым в порядке документа.

таким образом, реальная разница заключается в том, что вы конвертируете в строку и как это преобразование происходит.