【问题标题】:How do I extract/parse dictionary elements using Python?如何使用 Python 提取/解析字典元素?
【发布时间】:2020-07-11 22:21:39
【问题描述】:

我想从几十年中提取00后,但所有尝试都没有达到预期的结果。

这是我的 XML 文件的一部分,另存为 gorillas_catalog.xml。

<CATALOG>
    <CD decade="00s">
        <TITLE>Gorillaz</TITLE>
        <ARTIST>Gorillaz</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>Virgin</COMPANY>
        <PRICE>10.90</PRICE>
        <YEAR>2001</YEAR>
    </CD>
    <CD decade="00s">
        <TITLE>Demon Days</TITLE>
        <ARTIST>Gorillaz</ARTIST>
        <COUNTRY>UK</COUNTRY>
        <COMPANY>Parlaphone</COMPANY>
        <PRICE>9.90</PRICE>
        <YEAR>1988</YEAR>
    </CD>

我的预期结果是这样的:

Title: Gorillaz, Album: Gorillaz, Decade: 00s
Title: Gorillaz, Album: Demon Days, Decade: 00s

我的 XML 文件的其余部分以此类推。

我测试了每个部分,并得到了以下代码:

import xml.etree.ElementTree as ET

tree = ET.parse("gorillaz_catalog.xml")
root = tree.getroot()

for ARTIST in root.iter("ARTIST"):
    print("Artist:", ARTIST.text)

for TITLE in root.iter("TITLE"):
    print("Title:", TITLE.text)

for decade in root.iter("CD"):
    print("Decade:", decade.attrib)

十年来,我收到了Decade: {'decade': '00s'},而我只想要00s

然后我尝试循环所有内容以获得我想要的结果(在注释掉上面的 3 for 语句之后)。

for ARTIST in root.iter("ARTIST"):
    for TITLE in root.iter("TITLE"):
        for decade in root.iter("CD"):
            print("Artist:", ARTIST.text,", Title:", TITLE.text, ", Decade:", decade.attrib)

我得到的结果循环了 20 次到很多次:

Artist: Gorillaz , Album: Gorillaz , Decade: {'decade': 00s'}

二十次(即文件中的记录数),然后

Artist: Gorillaz , Album: Demon Days , Decade: {'decade': '80s'}

二十次...

所以这给了我想要的线路,但我不需要每次 20 次。

  1. 显然我的嵌套循环不正确,那么如何让它产生我想要的行?我想我可能需要将这些项目放入字典列表中,但我不太熟悉如何完成此操作。

【问题讨论】:

    标签: python xml parsing


    【解决方案1】:

    我认为你让它有点太复杂了;用另一个库加上 xpath 试试:

    import lxml.html as lh
    
    cds = """[your html above]"""
    
    doc = lh.fromstring(cds)
    for cd in doc.xpath('//cd'):
        decade = cd.xpath('./@decade')[0]
        title = cd.xpath('./title/text()')[0]
        artist = cd.xpath('./artist/text()')[0]
        print("Title: "+title+", Artist: "+artist+", Decade: "+decade)
    

    输出:

    Title: Gorillaz, Artist: Gorillaz, Decade: 00s
    Title: Demon Days, Artist: Gorillaz, Decade: 00s
    

    【讨论】:

      【解决方案2】:

      这是我在发布后查看更多文档后的最终代码。谢谢大家的建议。

      import xml.etree.ElementTree as ET
      
      tree = ET.parse("gorillaz_catalog.xml")
      root = tree.getroot()
      
      for item in tree.iterfind("CD"):
          artist = item.findtext("ARTIST")
          title = item.findtext("TITLE")
          decade = item.get("decade")
          print(f"Artist: {artist}, Album: {title}, Decade: {decade}")
      

      输出:

      > Title: Gorillaz, Album: Gorillaz, Decade: 00s
      > Title: Gorillaz, Album: Demon Days, Decade: 00s
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多