Python XML Разбор компакт-дисков - PullRequest
0 голосов
/ 12 июля 2020

Вот часть того, как выглядит мой 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.

  1. Какое ключевое слово или синтаксис мне нужно извлечь только 00s для каждой строки?

Затем я попытался l oop все, чтобы получить желаемые результаты (после комментирования 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 раз каждый.

Очевидно, что мой вложенный l oop неверен, так как мне заставить его выдавать мои предполагаемые строки? Я думаю, что мне может понадобиться поместить элементы в список словаря, но я не слишком хорошо знаком с этим.

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вот мой окончательный код после ознакомления с дополнительной документацией после публикации. Всем спасибо за совет.

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
0 голосов
/ 12 июля 2020

Я думаю, вы сделали это слишком сложно; попробуйте с другой библиотекой плюс 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
...