Мне нужно разобрать файл XML с помощью python, но я не могу импортировать какую-либо библиотеку, для которой требуется pip

Ситуация такова, что мне нужно название книги и числовое значение в разделе «Оценка» и поместить их в двухмерный список. Мой текущий код может получить название книги и оценку, поместив их в список, но проблема в том, что в файле 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)

Код выполняет итерацию по тегу title, которого нет нигде в примере данных.

Michael Butscher 17.11.2022 19:27

исправлена ​​предыдущая ошибка

Marcus Availo 17.11.2022 19:48

Используйте только один крайний цикл for, который перебирает теги «книжный магазин». В цикле ищите теги «книга» и «провинция» на основе элемента «книжный магазин», а не корня документа. Из найденной информации создайте кортеж с заголовком и оценкой (если он найден или «Н/Д», если он не найден).

Michael Butscher 17.11.2022 20:01

Пожалуйста, не повторяйте вопрос только потому, что вам не понравился ни один из полученных ответов. Вы должны написать новый вопрос, если он на самом деле отличается. Если вы хотите прояснить или подчеркнуть особенности вопроса, вам следует отредактировать его (что также поднимет его в списках внимания).

rici 18.11.2022 00:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться:

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"),
]

Другие вопросы по теме