XPath соответствует каждому узлу, содержащему текст

Как рекурсивно сопоставить все дочерние узлы, содержащие текст.

Если у меня есть дерево вроде

table
 tr
  td
   "hello"
  td
   b
    "hi"
 tr
  td
   "salud"
  td
   em
    "bonjour"

Как сопоставить каждую строку в узле таблицы с помощью xpath? Что-то вроде "//table/*/text()"?


person Verhogen    schedule 09.04.2011    source источник


Ответы (2)


Выражение XPath, которое вы дали, уже было почти правильным:

//table//text()

вы получите все текстовые узлы во всех таблицах документа.

person Simon    schedule 09.04.2011

Как насчет следующего?

from lxml import etree
from StringIO import StringIO

input = '''
<table>
 <tr>
  <td>hello</td>
  <td><b>hi</b></td>
 </tr>
 <tr>
  <td>salud</td>
  <td><em>bonjour</em></td>
 </tr>
</table>
'''

parser = etree.HTMLParser()
tree = etree.parse(StringIO(input), parser)

for p in tree.xpath("//table/tr/td//text()"):
    print p

... что дает вывод:

hello
hi
salud
bonjour
person Mark Longair    schedule 09.04.2011
comment
Что, если мне нужно имя узла, а не текст узла? - person Sejal Parikh; 03.01.2018