在Python中使用etree解析XML

时间:2015-03-27 16:56:38

标签: python xml elementtree

我查看了文档和其他类似的问题,但无法解决这里出了什么问题!

我想使用API​​的XML输出。

我的XML看起来有点像这样:

<response>
<lst></lst>
<result>
    <doc>
        <str name ="pa">1234</str>
        <str name ="et">Title 1</str>
        <str name ="pb">Publisher 1</str>
        <str name ="ur">http://www.exampleone.com</str>
    </doc>
    <doc>
        <str name ="pa">5678</str>
        <str name ="et">Title 2</str>
        <str name ="pb">Publisher 2</str>
        <str name ="ur">http://www.exampletwo.com</str>
    </doc>
</result>

我想为每个doc元素获取“pa”。

这是我正在使用的代码,但什么都没有:

import requests
import xml.etree.ElementTree as ET

r = requests.get("api url goes here")

tree = ET.fromstring(r.content)

for doc in tree.findall("doc"):
    pan = doc.find('pa').text
    print pan

我做错了什么?

2 个答案:

答案 0 :(得分:3)

doc.find('pa')会搜索不存在的 pa元素

相反,您需要查找 str元素,name属性等于pa

doc.find('.//str[@name="pa"]')

演示:

>>> for doc in tree.findall("doc"):
...     pan = doc.find('.//str[@name="pa"]').text
...     print pan
... 
1234
5678

答案 1 :(得分:0)

这应该有用......

import xml.etree.ElementTree as ET

resp = '''<response><lst></lst><result><doc>
            <str name ="pa">1234</str>
            <str name ="et">Title 1</str>
            <str name ="pb">Publisher 1</str>
            <str name ="ur">http://www.exampleone.com</str>
          </doc>
          <doc>
            <str name ="pa">5678</str>
            <str name ="et">Title 2</str>
            <str name ="pb">Publisher 2</str>
            <str name ="ur">http://www.exampletwo.com</str>
          </doc></result></response>'''

tree = ET.fromstring(resp)

for pan in tree.findall('.//str[@name="pa"]'):
    print(pan.text)

使用您的代码,它需要进行微小的更改才能工作:

或者:

for doc in tree[1].findall("doc"):
    pan = doc.find('str[@name="pa"]').text
    print (pan)

或者

for doc in tree.findall(".//doc"):
    pan = doc.find('str[@name="pa"]').text
    print (pan)