【问题标题】:print tag value from xml using python使用python从xml打印标签值
【发布时间】:2015-05-14 15:51:41
【问题描述】:

我正在尝试编写一个 Python 脚本,用于在 XML 输出中打印特定标记的值。在这里,我需要打印的标记值是 XML 输出中每次出现的值。我尝试如下,但它显示属性错误。这里有什么问题?获取和打印我有兴趣看到的某些更多标签的值的正确方法是什么?请问有什么帮助吗?谢谢。

import xml.etree.ElementTree as ET

mystring="""<?xml version="1.0" encoding="UTF-8"?>
<main>
    <student>
        <male>
            <result>pass</result>
            <name>Paul</name>
            <address>boston</address>
            <localreference>
                <name>Charlie</name>
            </localreference>
        </male>
        <female>
            <result>pass</result>
            <name>Rose</name>
            <address>newyork</address>
            <localreference>
                <name>Charlie</name>
            </localreference>
        </female>
    </student>
    <student>
        <male>
            <result>fail</result>
            <name>Philippe</name>
            <address>boston</address>
            <localreference>
                <name>White</name>
            </localreference>
        </male>
    </student>
</main>"""

main = ET.fromstring(mystring)
for student in main:
  if (student.tag == "student"):
      print student.find("male/result").text
      print student.find("female/result").text

错误>

# python new5.py
pass
pass
fail
Traceback (most recent call last):
  File "new5.py", line 39, in <module>
    print student.find("female/result").text
AttributeError: 'NoneType' object has no attribute 'text'

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    ElementTree 支持XPath 的子集,这对于您的示例可能更容易:

    root = ET.fromstring(mystring)
    for gender in ('male', 'female'):
        print gender
        for student in root.findall('./student/%s' % gender): 
            print '\t{:20}: {}'.format(student.find('name').text, student.find('result').text)
    

    打印:

    male
        Paul                : pass
        Philippe            : fail
    female
        Rose                : pass
    

    (顺便说一句:避免使用 main 作为变量名,因为您破坏了 main 模块的名称)


    如果您希望结果按文档顺序而不是按性别分组,您可以执行以下操作:

    for students in root.findall('./student'):
        for gender in students:
            print ' '.join([gender.tag] + map(lambda a: gender.find(a).text, ('name', 'address', 'result', 'localreference/name')))
    

    打印

    male Paul boston pass Charlie
    female Rose newyork pass Charlie
    male Philippe boston fail White
    

    【讨论】:

    • 谢谢 Dawg。但是我得到这个错误。 # python new5.py 男性 Traceback(最近一次调用最后一次):文件“new5.py”,第 40 行,在 print '\t{:20}: {}'.format(student.find('name' ).text, student.find('result').text) ValueError: 格式中的零长度字段名称
    • 什么版本的 os Python?你可能有 Python 2.6。格式字符串使用'\t{0:20}: {1}'
    • 太棒了,成功了。我正在使用 2.6.6 。不好意思问一下,我是这里的初学者,你介意解释一下最后的打印语句吗? print '\t{:20}: {}'.format(student.find('name').text, student.find('result').text) 谢谢 Dawg..
    • 是Python格式mini language
    【解决方案2】:

    您打印标签值的代码是正确的,但您要求的部分 xml 不存在。第二个学生部分没有女性部分。这就是为什么student.find("female/result") 在第二个学生上返回None,而你不能在None 对象上调用.text

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2019-08-26
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多