Я недавно столкнулся с проблемой.

Мне нужно найти тег div на странице, содержащей определенный текст. Проблема в том, что текст разделен на две части внутренним тегом ссылки, так что дерево HTML будет выглядеть так:

**<html>
    <...>
    <div>
        start of div text - part 1
        <a/>
        end of div text - part 2
    </div>
    <...>
</html>**

Чтобы однозначно идентифицировать этот тег div, мне понадобятся две части текста div. Естественно, я бы придумал что-то вроде этого XPath:

.//div[contains(text(), 'start of div text') and contains(text(), 'end of div text')]

Однако, это не работает, вторая часть не может быть найдена.

Как лучше всего описать этот тип тега однозначно?

4
Alex.K 20 Авг 2018 в 18:43

5 ответов

Лучший ответ

Попробуйте использовать ниже XPath для соответствия необходимому div двум текстовым узлам:

//div[normalize-space(text())="start of div text - part 1" and normalize-space(text()[2])="end of div text - part 2"]
3
Andersson 20 Авг 2018 в 16:23

Вы были почти у цели. Вам просто нужно заменить text() на . следующим образом:

//div[contains(., 'start of div text') and contains(., 'end of div text')]

Вот снимок проверки:

xpath_tester

1
DebanjanB 20 Авг 2018 в 19:18

Если все, что вам нужно, это элемент div этих дочерних текстовых элементов, то вы можете изолировать часть уникального содержимого от «part 1» и попробовать следующее:

//*[contains(., 'part 1')]/parent::div

Таким образом, вам не придется думать об атрибутах div.

Однако обычно это не . В идеале, вы должны использовать следующий Xpath в большинстве случаев:

//div[@id,('some id') and contains(., 'part 1')]

0
pcwhite 20 Авг 2018 в 21:30

Хорошо, если у вас есть дерево HTML DOM, например:

<div id="container" class="someclass">
    <div>
        start of div text - part 1
        <a/>
        end of div text - part 2
    </div>
 </div>  

Для извлечения текста div вы можете написать xpath так:

//div[@id='container']/child::div  

П.С .: Написание xpath на основе текста для нахождения одного и того же точного текста не является хорошим способом написания Xpath.

0
cruisepandey 20 Авг 2018 в 16:02

Это должно работать:

//div[contains(text(), 'start of div text') and contains(./a/text(), 'end of div text')]
0
Kevin Kamonseki 20 Авг 2018 в 16:01
51934274