Как вы выбираете два разных тега через xpath, оба на разных уровнях, когда один из них является необязательным

У меня есть ситуация, когда данные представляют собой сочетание этих форматов на одной странице. Другими словами, некоторые строки будут отображаться как:

some lengthy XPATH_X uptill here:
<td/>
<td>
   I Need this element td
</td>
<td/>
<td/>
<td/>
<td/>

и несколько других строк будут показаны в этом формате:

the same lengthy XPATH_X uptill here:
<td/>
<td>
    <span>
        I Need this element span
    </span>
</td>
<td/>
<td/>
<td/>
<td/>

Обратите внимание, что для каждого из тд-тегов нет атрибутов дифференцирования. Мне нужно выбрать вторую строку (td) в обоих случаях.

Я пытаюсь поймать оба элемента, используя следующий xpath:

XPATH_X/*[self::td[position()=2] or self::td[position()=2]/span]

Я попробовал это на странице, но по какой-то причине ничего не выбирает.

Может кто-то, пожалуйста, помогите мне с этим? Я уже потратил более 2 часов на это.

Всего 1 ответ


Вы должны попробовать XPATH_X/td[2]//text() чтобы получить текст, находится ли он в корневом td или в дочернем теге

Вы можете проверить его здесь ; в этом тесте я получаю три результата:

  • текст внутри span внутри td
  • текст в корне td
  • как тексты в корне td и внутри закрытого span (если это не работает для вас, и текст td должен быть получен только в том случае, если нет span , используйте XPATH_X/td[position()=2 and not(./span)]/text() | XPATH_X/td[2]/span/text() вместо)

Чтобы получить элементы, содержащие текстовые узлы, а не только текстовый узел, вы можете использовать следующее:

XPATH_X/td[2]//self::node()[text()]

Есть идеи?

10000