我有一些html文件,其中包含以下内容:
<div>Chapter 1. <span>Contents of chapter N1.</span> </div>
<div>Chapter 2. <span>Contents of chapter N2.</span> </div>
我正在尝试提取这些标记中包含的文本,并使用xpath'// text()'函数:
parser = etree.HTMLParser()
tree = etree.parse(StringIO(html),parser)
text = list(set( tree.xpath('//text()') ))
text = " ".join(text)
除了我想改变提取的顺序外,它工作正常。现在我得到以下结果:
第N1章的内容。第N2章的内容。第2章第1章。
但我希望得到结果:
第1章第1章的内容。第2章的内容。
除了从文档顶部递归处理每个标记到底部之外,还有更好的方法吗?
答案 0 :(得分:1)
你确定string(/)
不会给你你想要的答案吗?它与你所拥有的不完全相同,因为对于文档<p><i>Hello</i>!</p>
,它会给你"Hello!"
而不是"Hello !"
,但在大多数情况下,我会认为这就是你想要的。 / p>
答案 1 :(得分:0)
好像您尝试使用set
删除重复项。
在python中,set
中的元素是无序的,这意味着从集合中获取元素的顺序取决于实现,因此如果您不能使用此方法删除重复项想保留订单。
text = " ".join(tree.xpath("//text()"))
在您没有重复的情况下会产生预期的结果。