Как выбрать HTML-элемент по внутреннему тексту?

Например, у меня есть такая структура:

<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?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это решение так же надежно, как и исходный код (например, если источник изменится, он будет сломан):

//text()[contains(., 'from the video game series')][preceding-sibling::div and following-sibling::div]

Можете протестировать здесь.

но что, если я хочу выбрать родительский элемент div, который содержит этот текст? (не только сам текст) Что-то вроде этого: //div[normalize-space(./text()[2 ])='is вымышленный компьютер с искусственным интеллектом система']

Demiteli 20.09.2018 11:41

соответствует ЛЮБОМУ div, содержащему 'из серии видеоигр', верно? Не только между первым и вторым div (не в селекторе // div / text () [2])

Demiteli 20.09.2018 13:31

@Demiteli, не могли бы вы добавить пример из реальной жизни в свой исходный пост? Если бы вы могли это сделать, возможно, мы дадим вам более точный ответ.

fabrik 20.09.2018 13:33

что ты имеешь в виду под «примером из реальной жизни»? Предположим, это исследовательский вопрос о возможности такого выражения xpath

Demiteli 20.09.2018 13:36

@Demiteli разве эти div не имеют атрибутов id, class и т. д.?

fabrik 20.09.2018 13:36

они этого не делают, с атрибутами это будет другой вопрос

Demiteli 20.09.2018 13:37

@Demiteli from the video game series находится в топе div, независимо от того, как вы его запрашиваете.

fabrik 20.09.2018 13:41

о, я понял, я добавил еще один div к вопросу. Проблема в том, что я хочу выбрать только первый div (потому что он содержит «из серии видеоигр» между первым и вторым внутренним div), но ваше выражение xpath выберет оба элемента div

Demiteli 20.09.2018 13:47

спасибо за ответ, последнее ближе к истине :) а как насчет требования «который содержит 'из серии видеоигр'»? Этот xpath также выберет текст «123». Что-то подобное? // text () [previous-sibling :: div и following-sibling :: div and contains (text (), 'вымышленная компьютерная система с искусственным интеллектом')]

Demiteli 20.09.2018 16:04
Ответ принят как подходящий

Чтобы выбрать элемент 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])

Demiteli 20.09.2018 13:31

Другие вопросы по теме