#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()]
также работает безупречно!