Nano Hash - криптовалюты, майнинг, программирование

Как решить ошибку ключа при разборе XML-файла в Python

У меня есть следующий файл XML, который я хочу преобразовать в Pandas DataFrame.

row {'Id': '-1', 'Reputation': '1', 'CreationDate': '2009-09-28T00:00:00.000', 'DisplayName': 'Community', 'LastAccessDate': '2010-11-10T17:25:34.627', 'WebsiteUrl': 'http://meta.stackexchange.com/', 'Location': 'on the server farm', 'AboutMe': '<p>Hi, I\'m not really a person.</p>\n\n<p>I\'m a background process that helps keep this site clean!</p>\n\n<p>I do things like</p>\n\n<ul>\n<li>Randomly poke old unanswered questions every hour so they get some attention</li>\n<li>Own community questions and answers so nobody gets unnecessary reputation from them</li>\n<li>Own downvotes on spam/evil posts that get permanently deleted</li>\n<li>Own suggested edits from anonymous users</li>\n<li><a href="http://meta.stackexchange.com/a/92006">Remove abandoned questions</a></li>\n</ul>\n', 'Views': '0', 'UpVotes': '21001', 'DownVotes': '27468', 'AccountId': '-1'}
row {'Id': '1', 'Reputation': '21228', 'CreationDate': '2009-09-28T14:35:46.490', 'DisplayName': 'Anton Geraschenko', 'LastAccessDate': '2020-05-17T06:51:32.333', 'WebsiteUrl': 'http://stacky.net', 'Location': 'Palo Alto, CA, United States', 'AboutMe': '<p>You can get in touch with me at [email protected].</p>\n', 'Views': '25360', 'UpVotes': '1052', 'DownVotes': '90', 'AccountId': '36500'}

Следующий код работает для почти идентичного файла XML, но когда я использую его для этого файла, я получаю сообщение об ошибке:

КОД

users_tree = ET.parse("/content/Users.xml")
users_root = users_tree.getroot()

file_path_users = r"/content/Users.xml"
dict_list_users = []

for _, elem in ET.iterparse(file_path_users, events=("end",)):
    if elem.tag == "row":
        dict_list_users.append({'UserId': elem.attrib['Id'],
                          'Reputation': elem.attrib['Reputation'],
                          'CreationDate': elem.attrib['CreationDate'],
                          'DisplayName': elem.attrib['DisplayName'],
                          'LastAccessDate': elem.attrib['LastAccessDate'],
                          'WebsiteUrl': elem.attrib['WebsiteUrl'],
                          'Location': elem.attrib['Location'],
                          'AboutMe': elem.attrib['AboutMe'],
                          'Views': elem.attrib['Views'],
                          'UpVotes': elem.attrib['UpVotes'],
                          'DownVotes': elem.attrib['DownVotes'],
                          'AccountId': elem.attrib['AccountId']})
elem.clear()

df_users = pd.DataFrame(dict_list_users)

ОШИБКА

KeyError                                  Traceback (most recent call last)
<ipython-input-18-7af87798bae8> in <module>()
     24                           'DisplayName': elem.attrib['DisplayName'],
     25                           'LastAccessDate': elem.attrib['LastAccessDate'],
---> 26                           'WebsiteUrl': elem.attrib['WebsiteUrl'],
     27                           'Location': elem.attrib['Location'],
     28                           'AboutMe': elem.attrib['AboutMe'],

KeyError: 'WebsiteUrl'

ПРИМЕЧАНИЕ. Эта ошибка возникает для всех атрибутов после LastAccessDate, т. е. даже если я удаляю ключ WebsiteUrl, я получаю сообщение об ошибке для следующего атрибута и так далее.

Пожалуйста, дайте мне способ исправить это.


Ответы:


1

Ошибка возникает из-за отсутствия атрибутов в одном или нескольких тегах <row>. Вместо того, чтобы явно назначать словарные ключи/значения для каждого атрибута, рассмотрите возможность получения всех атрибутов. При этом окончательный конструктор DataFrame будет вводить NAs в строки с отсутствующими атрибутами.

for _, elem in ET.iterparse(file_path_users, events=("end",)):
    if elem.tag == "row":
        dict_list_users.append(elem.attrib)    # RETRIEVE ALL ATTRIBUTES

        elem.clear()                           # SHOULD BE AT NESTED LEVEL

df_users = pd.DataFrame(dict_list_users)

Если приведенное выше извлекает больше столбцов, чем необходимо, оставьте только соответствующие столбцы с reindex:

df_users = df_users.reindexc(['UserId', 'Reputation', 'CreationDate', 'DisplayName',
                              'LastAccessDate', 'WebsiteUrl', 'Location', 'AboutMe',
                              'Views', 'UpVotes', 'DownVotes', 'AccountId'], 
                              axis='columns')
30.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..