猿问

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

我正在尝试使用 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 ET


tree = 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

    ))

但是,一旦到达没有“邮政编码”标签的项目,它就会失败。


我怎么能跑这个?提前致谢


阿晨1998
浏览 118回答 3
3回答

慕姐4208626

正如@AmitaiIrron 所建议的,xpath可以在这里提供帮助。此代码在文档中搜索名为 的元素zip-code,然后返回 ping 以获取该元素的父元素。从那里,您可以获得属性,并与元素name中的文本配对zip-codefor ent in root.findall(".//zip-code/.."):&nbsp; &nbsp; print(ent.attrib.get('name'), ent.find('zip-code').text)studio 14407mailbox 33896garage 33746gym 33746要么{ent.attrib.get('name') : ent.find('zip-code').text&nbsp;&nbsp;for ent in root.findall(".//zip-code/..")}{'studio': '14407', 'mailbox': '33896', 'garage': '33746', 'gym': '33746'}

三国纷争

你的循环应该是这样的:# Find all <entry> tags in the hierarchyfor item in root.findall('.//entry'):&nbsp; &nbsp; # Try finding a <zip-code> child&nbsp; &nbsp; zipc = item.find('./zip-code')&nbsp; &nbsp; # If found a child, print data for it&nbsp; &nbsp; if zipc is not None:&nbsp; &nbsp; &nbsp; &nbsp; names = (item.attrib)&nbsp; &nbsp; &nbsp; &nbsp; print(' {} {} '.format(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; names, zipc.text&nbsp; &nbsp; &nbsp; &nbsp; ))在搜索 XML 树时,学习正确使用xpath是个问题。

慕桂英4014372

如果您使用正则表达式没有问题,则以下工作正常:import refile = open('file.xml', 'r').read()pattern = r'name="(.*?)".*?<zip-code>(.*?)<\/zip-code>'matches = re.findall(pattern, file, re.S)for m in matches:&nbsp; &nbsp; print("{} {}".format(m[0], m[1]))并产生结果:studio 14407mailbox 33896garage 33746aystore 33746
随时随地看视频慕课网APP

相关分类

Python
我要回答