为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Python 中具有不同标签的子项解析 XML

使用 Python 中具有不同标签的子项解析 XML

阿晨1998 2022-12-27 15:47:19
我正在尝试使用 python 解析文件中的以下 xml 数据,以便仅打印带有标签“zip-code”及其属性名称的元素<response status="success" code="19"><result total-count="1" count="1">  <address>    <entry name="studio">      <zip-code>14407</zip-code>      <description>Nothing</description>    </entry>    <entry name="mailbox">      <zip-code>33896</zip-code>      <description>Nothing</description>    </entry>    <entry name="garage">      <zip-code>33746</zip-code>      <description>Tony garage</description>    </entry>    <entry name="playstore">      <url>playstation.com</url>      <description>game download</description>    </entry>    <entry name="gym">      <zip-code>33746</zip-code>      <description>Getronics NOC subnet 2</description>    </entry>    <entry name="e-cigars">      <url>vape.com/24</url>      <description>vape juices</description>    </entry>   </address></result></response>我要运行的 python 代码是from xml.etree import ElementTree as ETtree = ET.parse('file.xml')root = tree.getroot()items = root.iter('entry')for item in items:    zip = item.find('zip-code').text    names = (item.attrib)    print(' {} {} '.format(        names, zip    ))但是,一旦到达没有“邮政编码”标签的项目,它就会失败。我怎么能跑这个?提前致谢
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

正如@AmitaiIrron 所建议的,xpath可以在这里提供帮助。


此代码在文档中搜索名为 的元素zip-code,然后返回 ping 以获取该元素的父元素。从那里,您可以获得属性,并与元素name中的文本配对zip-code


for ent in root.findall(".//zip-code/.."):

    print(ent.attrib.get('name'), ent.find('zip-code').text)


studio 14407

mailbox 33896

garage 33746

gym 33746

要么


{ent.attrib.get('name') : ent.find('zip-code').text 

 for ent in root.findall(".//zip-code/..")}


{'studio': '14407', 'mailbox': '33896', 'garage': '33746', 'gym': '33746'}


查看完整回答
反对 回复 2022-12-27
?
三国纷争

TA贡献1804条经验 获得超7个赞

你的循环应该是这样的:


# Find all <entry> tags in the hierarchy

for item in root.findall('.//entry'):

    # Try finding a <zip-code> child

    zipc = item.find('./zip-code')

    # If found a child, print data for it

    if zipc is not None:

        names = (item.attrib)

        print(' {} {} '.format(

            names, zipc.text

        ))

在搜索 XML 树时,学习正确使用xpath是个问题。


查看完整回答
反对 回复 2022-12-27
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

如果您使用正则表达式没有问题,则以下工作正常:


import re


file = open('file.xml', 'r').read()


pattern = r'name="(.*?)".*?<zip-code>(.*?)<\/zip-code>'

matches = re.findall(pattern, file, re.S)


for m in matches:

    print("{} {}".format(m[0], m[1]))

并产生结果:


studio 14407

mailbox 33896

garage 33746

aystore 33746


查看完整回答
反对 回复 2022-12-27
  • 3 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信