Xpath text()函数用法

时间:2013-07-04 13:02:26

标签: python xpath lxml

我有一些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章的内容。

除了从文档顶部递归处理每个标记到底部之外,还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

你确定string(/)不会给你你想要的答案吗?它与你所拥有的不完全相同,因为对于文档<p><i>Hello</i>!</p>,它会给你"Hello!"而不是"Hello !",但在大多数情况下,我会认为这就是你想要的。 / p>

答案 1 :(得分:0)

好像您尝试使用set删除重复项。

在python中,set中的元素是无序的,这意味着从集合中获取元素的顺序取决于实现,因此如果您不能使用此方法删除重复项想保留订单。

text = " ".join(tree.xpath("//text()"))

在您没有重复的情况下会产生预期的结果。