使用XPath提取的XML文档结构构建嵌套列表

时间:2016-10-11 14:32:50

标签: python xpath

我正在尝试获取所有<h2>标记的文本(使用xpath):

<div id="static_id">
 <div>...
 <a ...>
 <div>...
   <h2>Text 1</h2>
 <a ...>
 <div>...
 <div>...
 <span>...
   <h2>Text 2</h2>
  <a ...>
  <span>...
    <h2>Text 3</h2>

<div id="static_id">
 <div>...
 <span>...
   <h2>Text A</h2>
 <a ...>
 <div>...
 <p>...
 <div>...
   <h2>Text B</h2>
 <a ...>
   <h2>Text C</h2>
 [...]

在我的HTML源代码中,<div>'s的ID为static_id。在这些div中只有一个<h2>标记,我想获得它的内容。最后,我希望有一个如下所示的列表:

lst = [["Text 1", "Text 2", "Text 3"], ["Text A", "Text B", "Text C"]]

请注意,它是一个列表列表(来自一个<div id="static_id">的每个h2文本应最终位于单独的列表中,如上例所示。

有没有简单的方法来实现这一目标?

我以为我会计算所有static_id个div并迭代所有<h2>个标记以实现此目的。我的方法:

list_all = []
div_amount = len(tree.xpath('//div[@id="static_id"]')) # 2 elements in this case (works)
for d in range(1, div_amount+1) # 1,2
  h2_count = len(tree.xpath('//div[@class="static_id"]['+str(d)+']//h2')) #count h2
  lst = []
  for i in range(1, h2_count+1) #1,2,3
    h2_text = ''.join(tree.xpath('//div[@id="static_id"]['+str(d)+']//h2['+i+']/text()'))
    lst.append(h2_text)
  list_all.append(lst)

第2行:计算所有id =“static_id”

第3行:遍历所有id =“static_id”

第4行:计算所有h2(遗憾的是,来自HTML源的所有h2都被计算在内)

第5行:遍历所有h2的

第6行:获取h2'text,然后保存在列表中

有人可以帮帮我吗?我觉得这样做可以更容易,但我不知道如何。

1 个答案:

答案 0 :(得分:0)

轻松制作单行:

list_all = [ static_id_div.xpath('.//h2/text()')
             for static_id_div in tree.xpath('//div[@id="static_id"]') ]

这里的重要区别是内部查询是针对外部查询返回的元素运行,而不是让它们从文档的根开始工作。