Ситуация такова, что мне нужно название книги и числовое значение в разделе «Оценка» и поместить их в двухмерный список. Мой текущий код может получить название книги и оценку, поместив их в список, но проблема в том, что в файле XML есть некоторые разделы, где оценка отсутствует, и мне нужно иметь возможность оставить индикатор (например, N/ A) в списке, чтобы указать, что значение для этого конкретного названия книги пусто.
Пожалуйста, обрати внимание: Задавал этот вопрос ранее, но ответ включал библиотечную функцию, использующую pip, и был слишком узким по объему. Он включал ответ, который предполагал, что проблема появляется только один раз в XML-файле, как здесь, в образце XML-файла.
Это пример упрощенной версии XML-файла. В полном XML-файле содержится более 100 названий книг и партитур. Некоторые содержат баллы, некоторые нет. Таким образом, ни один код не может использовать [1] в качестве индекса, чтобы обойти эту проблему. Этот вопрос публикуется снова, чтобы избежать этой самой проблемы.
<bookstore>
<book>[A-23] Everyday Italian</book>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
<field></field>
<key id = "6408">[A-23]Everyday Italian</key>
<brief>Everyday Italian</brief>
<success></success>
<province> id = "256" key = ".com.place.fieldtypes:float">
<name>Post</name>
<numbers>
<number></number>
</numbers>
</province>
<province> id = "490" key = ".com.ave.fieldtypes:float">
<name>Score</name>
<numbers>
<number>4.0</number>
</numbers>
</province>
<province> id = "531" key = ".com.spot.fieldtypes:float">
<name>Doc</name>
<numbers>
<number></number>
</numbers>
</province>
</bookstore>
<bookstore>
<book>[A-42] Pottery</book>
<author>Leo Di Plos</author>
<year>2012</year>
<price>25.00</price>
<field></field>
<key id = "4502">[A-42] Pottery</key>
<brief>Pottery</brief>
<success></success>
<province> id = "627" key = ".com.tri.fieldtypes:float">
<name>Post</name>
<numbers>
<number></number>
</numbers>
</province>
<province> id = "124" key = ".com.doct.fieldtypes:float">
<name>Doc</name>
<numbers>
<number></number>
</numbers>
</province>
</bookstore>
<bookstore>
<book>[A-12] Skipping the Line</book>
<author>Gloria Gasol</author>
<year>1999</year>
<price>22.00</price>
<field></field>
<key id = "1468">[A-23]Skipping the Line</key>
<brief>Skipping the Line</brief>
<success></success>
<province> id = "754" key = ".com.cit.fieldtypes:float">
<name>Post</name>
<numbers>
<number></number>
</numbers>
</province>
<province> id = "211" key = ".com.soct.fieldtypes:float">
<name>Score</name>
<numbers>
<number>12.0</number>
</numbers>
</province>
<province> id = "458" key = ".com.lot.fieldtypes:float">
<name>Doc</name>
<numbers>
<number></number>
</numbers>
</province>
</bookstore>
........................
and so on
100+ more times
Это код:
import xml.etree.ElementTree as ET
import re
tree = ET.parse('book.xml')
root = tree.getroot()
book = []
for book in root.iter('book'):
item1 = book.text
book.append(item1)
score = []
for province in root.iter('province'):
for child in province:
for grandchild in child:
if re.match('^[+-]?\d*?\.\d+$', grandchild.text) != None:
item2 = float(grandchild.text)
score.append(item2)
print(book, score)
Ожидаемый результат:
([A-23] Everyday Italian, 4.0), ([A-42] Pottery, N/A), ([A-12] Skipping the Line, 12.0), .....
etc up to 100+ items on this list
Фактический результат:
([A-23] Everyday Italian, 4.0), ([A-42] Pottery, 12.0), ([A-12] Skipping the Line)
исправлена предыдущая ошибка
Используйте только один крайний цикл for, который перебирает теги «книжный магазин». В цикле ищите теги «книга» и «провинция» на основе элемента «книжный магазин», а не корня документа. Из найденной информации создайте кортеж с заголовком и оценкой (если он найден или «Н/Д», если он не найден).
Пожалуйста, не повторяйте вопрос только потому, что вам не понравился ни один из полученных ответов. Вы должны написать новый вопрос, если он на самом деле отличается. Если вы хотите прояснить или подчеркнуть особенности вопроса, вам следует отредактировать его (что также поднимет его в списках внимания).
Пытаться:
import xml.etree.ElementTree as ET
tree = ET.parse("your_xml_file.xml")
root = tree.getroot()
out = []
for bookstore in root.iter("bookstore"):
name = bookstore.find("book").text
score = bookstore.find('.//*[name = "Score"]')
if score:
score = score.find(".//number").text
out.append((name, score or "N/A"))
print(out)
Отпечатки:
[
("[A-23] Everyday Italian", "4.0"),
("[A-42] Pottery", "N/A"),
("[A-12] Skipping the Line", "12.0"),
]
Код выполняет итерацию по тегу title, которого нет нигде в примере данных.