XPath соответствует каждому узлу, содержащему текст - PullRequest
1 голос
/ 09 апреля 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

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

//table//text()

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

0 голосов
/ 09 апреля 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
...