Выберите все самые глубокие узлы с XPath 1.0, содержащие текст, игнорируя разметку - PullRequest
0 голосов
/ 23 декабря 2018

Я хочу извлечь элементы из HTML-страницы, содержащие текст, игнорируя разметку.Например, я хочу извлечь узел, содержащий текст «Беги, Сара, беги!»с https://en.wiktionary.org/wiki/run. Я знаю о проверке узла text() и функции string().Я попробовал их обоих: Firefox with the console. Searching

Как видите, если я использую string(), он возвращает слишком много узлов (результат включает в себя узлы, которые включают нужный мне узел), и если яиспользование text() ничего не возвращает (из-за тега <b>).

Как найти необходимые узлы?

UPD: Я хочу все самые глубокие узлы.Это означает, что если страница Wikitionary содержала это предложение дважды, я хотел выбрать два узла.

Кроме того, я не знаю тип узла.

1 Ответ

0 голосов
/ 23 декабря 2018

//*[contains(string(.), "Run, Sarah, run!")] возвращает все элементы (начиная с узла html до последнего узла-потомка), которые содержат эту строку.

//*[contains(text(), "Run, Sarah, run!")] ничего не возвращает, поскольку "Run, Sarah, run!" является составным текстом из нескольких текстовых узлов, но не из одного текстового узла

Вы можете использовать ниже, чтобы сопоставить курсивный узел с требуемым текстом:

'//i[normalize-space()="Run, Sarah, run!"]'

Если вы не хотите указывать имя узла, вы можете попробовать

'//*[normalize-space()="Run, Sarah, run!" and not(./*[normalize-space()="Run, Sarah, run!"])]'
...