Что вызывает эту ошибку KeyError при разборе этого XML-файла?

У меня есть файл xml, который я пытаюсь разобрать. Вот образец

</Event>


-<Event timestamp="2016-08-14T14:23:33.634" id="1713385925" 
version="1471181110290" last_modified="2016-08-14T14:25:11" y="11.0" 
x="89.7" outcome="0" team_id="148" player_id="51327" sec="8" min="23" 
period_id="1" type_id="4" event_id="205">

<Q id="733814222" qualifier_id="265"/>

<Q id="481660420" qualifier_id="286"/>

<Q id="813378778" qualifier_id="152"/>

<Q id="570443899" qualifier_id="56" value="Right"/>

<Q id="420312891" qualifier_id="233" value="248"/>

<Q id="1186861264" qualifier_id="13"/>

</Event>


-<Event timestamp="2016-08-14T14:23:33.634" id="1635888622" 
version="1471181110289" last_modified="2016-08-14T14:25:11" y="89.0" 
x="10.3" outcome="1" team_id="143" player_id="169007" sec="8" min="23" 
period_id="1" type_id="4" event_id="248">

<Q id="1871787686" qualifier_id="56" value="Back"/>

<Q id="176295814" qualifier_id="13"/>

<Q id="69346842" qualifier_id="233" value="205"/>

<Q id="1588029344" qualifier_id="265"/>

<Q id="559785299" qualifier_id="285"/>

<Q id="380723313" qualifier_id="152"/>

Таких событий полно. Я могу получить доступ ко всем другим атрибутам (outcome, type_id и т. д.) и дочерним тегам, но не могу сделать это для значений атрибута player_id. Ошибка - введите здесь описание изображения А вот пример кода xmldom, который я использую для его анализа.

xml = xmldoc.getElementsByTagName("Games")[0]
Events = xml.getElementsByTagName("Event")

for event in Events:
    typeid = event.attributes["type_id"]
    typeidval = typeid.value

    player = event.attributes["player_id"]
    playeridval = player.value

    teamid = event.attributes["team_id"]
    teamidval = teamid.value

    outcomeid = event.attributes["outcome"]
    outcomeidval = outcomeid.value

Может ли кто-нибудь помочь мне с кодом xmldom/minidom, чтобы решить эту проблему? Что именно я делаю неправильно?


person Abhishek    schedule 01.04.2019    source источник
comment
По-видимому, не все ваши теги событий имеют атрибут player_id.   -  person Martijn Pieters    schedule 01.04.2019
comment
О, это действительно может быть так. Как мне обойти это? @MartijnPieters   -  person Abhishek    schedule 01.04.2019
comment
Используйте ElementTree вместо minidom, которые имеют более современный интерфейс.   -  person Daniel    schedule 02.04.2019


Ответы (2)


Уродливым исправлением будет обработка исключения для атрибута player_id и установка значения "" при возникновении исключения:

try:
    player = event.attributes["player_id"]
    playeridval = player.value
except:
    playeridval = ""
person glhr    schedule 01.04.2019
comment
Почему это будет некрасиво? Похоже, в теории это сработает @glhr - person Abhishek; 02.04.2019

Более чистый подход:

player = event.attributes.get("player_id",None)
playeridval = player.value if player else ""
person balderman    schedule 04.04.2019