Например, у меня есть такая структура:
<div>
GLaDOS
<div>
is a fictional artificially intelligent computer system
</div>
from the video game series
<div>
Portal
</div>
</div>
<div>
from the video game series
<div>
is a fictional artificially intelligent computer system
</div>
123
<div>
Portal
</div>
</div>
И я хочу выбрать элемент, который содержит «из серии видеоигр» между первым и вторым внутренним div. Как должно выглядеть выражение xpath?






Это решение так же надежно, как и исходный код (например, если источник изменится, он будет сломан):
//text()[contains(., 'from the video game series')][preceding-sibling::div and following-sibling::div]
Можете протестировать здесь.
соответствует ЛЮБОМУ div, содержащему 'из серии видеоигр', верно? Не только между первым и вторым div (не в селекторе // div / text () [2])
@Demiteli, не могли бы вы добавить пример из реальной жизни в свой исходный пост? Если бы вы могли это сделать, возможно, мы дадим вам более точный ответ.
что ты имеешь в виду под «примером из реальной жизни»? Предположим, это исследовательский вопрос о возможности такого выражения xpath
@Demiteli разве эти div не имеют атрибутов id, class и т. д.?
они этого не делают, с атрибутами это будет другой вопрос
@Demiteli from the video game series находится в топе div, независимо от того, как вы его запрашиваете.
о, я понял, я добавил еще один div к вопросу. Проблема в том, что я хочу выбрать только первый div (потому что он содержит «из серии видеоигр» между первым и вторым внутренним div), но ваше выражение xpath выберет оба элемента div
спасибо за ответ, последнее ближе к истине :) а как насчет требования «который содержит 'из серии видеоигр'»? Этот xpath также выберет текст «123». Что-то подобное? // text () [previous-sibling :: div и following-sibling :: div and contains (text (), 'вымышленная компьютерная система с искусственным интеллектом')]
Чтобы выбрать элемент div, содержащий текст из серии видеоигр, вы можете использовать выражение XPath //div[contains(., 'from the video game series')]".
Чтобы ограничить этот выбор текстом между первым и вторым дочерним элементом div, попробуйте следующее: //div[contains(text()[count(preceding-sibling::div) = 1 and count(following-sibling::div) > 0], 'from the video game series')].
соответствует ЛЮБОМУ div, содержащему 'из серии видеоигр', верно? Не только между первым и вторым div (не в селекторе // div / text () [2])
но что, если я хочу выбрать родительский элемент div, который содержит этот текст? (не только сам текст) Что-то вроде этого: //div[normalize-space(./text()[2 ])='is вымышленный компьютер с искусственным интеллектом система']