在 Python 中使用 etree 解析 XML

Parsing XML using etree in Python

我查看了文档和其他类似问题,但无法弄清楚这里出了什么问题!

我想使用 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>

我想获取每个文档元素的 "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

我做错了什么?

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

这应该有效...

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)