xpath возвращает все непустые текстовые узлы, не являющиеся потомками `a`,` style` или `script` - PullRequest
16 голосов
/ 07 декабря 2010

Какое выражение выберет все текстовые узлы:

  • не пусто
  • не внутри a или script или style?

Ответы [ 3 ]

16 голосов
/ 09 декабря 2010

Используйте

//*[not(self::a or self::script or self::style)]/text()[normalize-space()]

Мало того, что это выражение короче, чем в принятом в настоящее время ответе, оно также может быть гораздо более эффективным .

Обратите внимание, что в выражении вообще не используются оси (назад / вверх).

16 голосов
/ 07 декабря 2010

Это следует делать, предполагая, что «не внутри» означает, что текстовый узел не должен быть потомком элемента «a», «script» или «style». Если «не внутри» означает только то, что не должно быть дочерним, тогда используйте parent :: a и т. Д. Вместо ancestor :: a.

//text()[normalize-space() and not(ancestor::a | ancestor::script | ancestor::style)]
3 голосов
/ 10 июня 2011

Я использовал ответ Дмитрия Новатчева, но потом наткнулся на проблему, описанную автором темы:

не потомок из a, style или script

Ответ Димитра исключает тег style, но включает его дочерние элементы.Эта версия исключает также style, script, noscript теги и их потомков:

//div[@id='???']//*[not(ancestor-or-self::script or ancestor-or-self::noscript or ancestor-or-self::style)]/text()

В любом случае, благодаря Димитру Новачеву.

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