如何选择文档中的所有文本节点?

时间:2013-08-30 09:02:45

标签: python xpath lxml

我有一份文件:

<html>
  <body>
    <p>Hello World!</p>
    <p>Goodbye!</p>
  </body>
</html>

我想迭代文档中的所有文本节点,执行命名实体识别(此组件适用于纯文本输入),然后输出通过我的识别算法的所有元素的xpath。我的问题是我不知道如何抓取文档中的所有文本元素而不丢弃它们的xpath信息。例如,

root.xpath("//text()")

只是产生一个扁平的字符串数组:

['\n    ', 'Hello World!', '\n    ', 'Goodbye!', '\n  ']

所有结构信息都丢失了,所以我无法分辨文件中每个字符串的位置。还有更好的方法吗?

以下是完整的资料来源:

import lxml.html
import sys
with open(sys.argv[1]) as fin:
    text_string = fin.read()
root = lxml.html.document_fromstring(text_string)
text_elements = root.xpath("//text()")
print text_elements

1 个答案:

答案 0 :(得分:2)

您可以使用getparent()访问父元素:

>>> import lxml.html
>>> text_string = '''<html>
...   <body>
...     <p>Hello World!</p>
...     <p>Goodbye!</p>
...   </body>
... </html>'''
>>> root = lxml.html.document_fromstring(text_string)
>>> text_elements = root.xpath('//text()')
>>> for t in text_elements:
...     print t.getparent(), type(t), repr(t)
... 
<Element body at 0x193b170> <class 'lxml.etree._ElementStringResult'> '\n    '
<Element p at 0x193b1d0> <class 'lxml.etree._ElementStringResult'> 'Hello World!'
<Element p at 0x193b1d0> <class 'lxml.etree._ElementStringResult'> '\n    '
<Element p at 0x193b290> <class 'lxml.etree._ElementStringResult'> 'Goodbye!'
<Element p at 0x193b290> <class 'lxml.etree._ElementStringResult'> '\n  '