使用Python ElementTree解析XML

时间:2017-11-14 07:38:45

标签: python xml elementtree

我有一个格式如下的XML文档

<root>
<H D="14/11/2017">
<FC>
    <F LV="0">The quick</F>
    <F LV="1">brown</F>
    <F LV="2">fox</F>
</FC>
</H>
<H D="14/11/2017">
<FC>
    <F LV="0">The lazy</F>
    <F LV="1">fox</F>
</FC>
</H>
</root>

如何从H标签内的'D'以及F标签内的所有文本中提取文本。

3 个答案:

答案 0 :(得分:3)

来自ElementTree docs

  

我们可以通过从文件中读取来导入此数据:

import xml.etree.ElementTree as ET

tree = ET.parse('country_data.xml')
root = tree.getroot()
  

或直接来自字符串:

root = ET.fromstring(country_data_as_string)

以后在同一页面,20.5.1.4。寻找有趣的元素:

for neighbor in root.iter('neighbor'):
    print(neighbor.attrib)

哪个转换为:

import xml.etree.ElementTree as ET

root = ET.fromstring("""
<root>
<H D="14/11/2017">
<FC>
    <F LV="0">The quick</F>
    <F LV="1">brown</F>
    <F LV="2">fox</F>
</FC>
</H>
<H D="14/11/2017">
<FC>
    <F LV="0">The lazy</F>
    <F LV="1">fox</F>
</FC>
</H>
</root>""")
# root = tree.getroot()
for h in root.iter("H"):
    print (h.attrib["D"])
for f in root.iter("F"):
    print (f.attrib, f.text)

输出:

14/11/2017
14/11/2017
{'LV': '0'} The quick
{'LV': '1'} brown
{'LV': '2'} fox
{'LV': '0'} The lazy
{'LV': '1'} fox

答案 1 :(得分:1)

你没有说明你究竟想要使用什么,所以我推荐用于python的 lxml 。为了获得你所获得的价值,你有更多的可能性:

有一个循环:

from lxml import etree
tree = etree.parse('XmlTest.xml')
root = tree.getroot()
text = []
for element in root:
   text.append(element.get('D',None))
     for child in element:
       for grandchild in child:
         text.append(grandchild.text)
print(text)

输出: [&#39; 14/11/2017&#39;,&#39;快速&#39;&#39;布朗&#39;狐狸&#39;&#39; 14/11 / 2017&#39;,&#39;懒惰的&#39;,&#39;狐狸&#39;]

使用xpath:

from lxml import etree
tree = etree.parse('XmlTest.xml')
root = tree.getroot() 
D = root.xpath("./H")
F = root.xpath(".//F")

for each in D:
  print(each.get('D',None))

for each in F:
  print(each.text)

输出: 14/11/2017 14/11/2017 快点 棕色 狐狸 懒人 狐狸

两者都有自己的优势,但给你一个很好的起点。 我建议使用xpath,因为它可以在值时为您提供更多自由 失踪。

答案 2 :(得分:1)

这应该可以帮到你

import xml.etree.ElementTree as ET
data='''
<root>
<H D="14/11/2017">
<FC>
    <F LV="0">The quick</F>
    <F LV="1">brown</F>
    <F LV="2">fox</F>
</FC>
</H>
<H D="14/11/2017">
<FC>
    <F LV="0">The lazy</F>
    <F LV="1">fox</F>
</FC>
</H>
</root>
'''
#list created to store data
D_data=[]
F_data=[]

#data parsed
root= ET.XML(data)

#This will get the value of D
for sub in root:
    b=(sub.attrib.get('D'))
    D_data.append(b)

#This will get all the text for F tag in xml
for f in root.iter("F"):
    b=f.text
    #print f.tag,f.attrib,f.text
    F_data.append(b)

print D_data
print F_data