Как исключить дочерний узел из xpath? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть следующий код:

<div class = "content">
  <table id="detailsTable">...</table>
  <div class = "desc">
     <p>Some text</p>
  </div>
  <p>Another text<p>
</div>

Я хочу выделить весь текст в классе содержимого, который я получу, используя этот xPath:

doc.xpath('string(//div[@class="content"])')

Проблема в том, что он выделяет весь текст, включая текст внутри тега 'table'. Мне нужно исключить «таблицу» из xPath. Как бы я этого достиг?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

XPath 1.0 решения:

substring-after(string(//div[@class="content"]),string(//div[@class="content"]/table))

Или просто используйте concat:

concat(//table/following::p[1]," ",//table/following::p[2])
0 голосов
/ 24 марта 2020

Выражение XPath //div[@class="content"] выбирает элемент div - не больше и не меньше - и применение функции string() дает вам строковое значение элемента, которое является объединением всех его дочерних текстовых узлов.

Получение всего текста за исключением того, что содержится в одном конкретном дочернем элементе, вероятно, невозможно в XPath 1.0. С XPath 2.0 это можно сделать как

string-join(//div[@class="content"]/(node() except table)//text(), '')

Но для такого рода манипуляций вы действительно находитесь в области трансформации, а не чистого выбора, поэтому вы расширяете пределы того, что разработано для XPath. для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...