Использование Xpath для выделения текста с несколькими пустыми родственными тегами

#jquery #html #xpath #cheerio

#jquery #HTML #xpath #приветствую

Вопрос:

Я пытаюсь написать xpath, который будет захватывать внутренние текстовые значения следующих тегов, в идеале я хотел бы использовать параметр OR, чтобы у меня был один xpath, выделяющий текст: Pay или Оплаченный в обоих случаях.

пример 1

 <td>
<a class="btn btn-success">Pay</a>
<div class="display:none"></div>
<div class="display:none"></div>
<div class="display:none"></div>
<div class="display:none"></div>
<div class="display:none"></div>
</td>
  

случай 2

 <td>
<div class="display:none"></div>
<div class="display:none"></div>
<div class="display:none"></div>
<div class="display:none"></div>
Paid
<div class="display:none"></div>
</td>
  

Подход, который я пытаюсь применить прямо сейчас, заключается в том, чтобы сначала попробовать и просто заставить xpath игнорировать все <div class="display:none"></div> , потому что xpath
//td/text() в итоге просто извлекаются все пустые теги div.

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

 //td::child[@text='Pay' OR @text='Paid']
//td/text()
//td::child[not(@class="display:none")]
  

Эти xpath в конечном итоге используются для извлечения данных с cheerio.js другим подходом, который я еще не рассматривал, было бы попробовать и повторить результаты из //td/text()

Кто-нибудь сталкивался с подобной проблемой раньше?

Комментарии:

1. Неясно, хотите ли вы выбрать какой-либо узел (элемент или текстовый узел) или просто получить некоторое строковое значение.

2. чтобы уточнить, мне нужно конкретно получить текстовый узел. Я использую cheerio.js для синтаксического анализа html и извлечения текстового значения, а не html-тега.

Ответ №1:

Получить все текстовые узлы, содержащие какое-либо содержимое после нормализации пространства:

//text()[boolean(string-length(normalize-space(.)))]

upd: мое решение затянуто. Смотрите комментарий @Alejandro

Комментарии:

1. Это выражение является подробным. Вам просто нужно //text()[normalize-space()] выделить все текстовые узлы документа, содержащие только пробелы.

2. Это работает для текстового узла, вложенного под тегом <a>, но не захватывает строку ‘Paid’ в 1-м случае. Когда я изменил его на //text()[boolean(string-length(normalize-space(.)))] , это сработало в обоих случаях. @Alejandro //text()[normalize-space()] также работает безупречно!