1

我有一个文件:

<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
4

1 回答 1

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  '
于 2013-08-30T09:08:29.080 回答