Как проанализировать некоторые необязательные элементы, присутствующие в XML-документе, с помощью скрипта python?

#python #xml #parsing

#python #xml #синтаксический анализ

Вопрос:

У меня есть XML-документ, собранный по ссылке ниже

http://ieeexplore.ieee.org/gateway/ipsSearch.jsp?py=2000amp;hc=100

Я анализирую Title , Abstract , Author и Affiliation из этого XML-документа и создаю отдельные текстовые файлы. В некоторых документах есть абстрактный элемент, но в некоторых его нет. Я написал скрипт на python, который используется для анализа обязательных полей, но не работает, если какой-либо из вышеупомянутых элементов отсутствует. пожалуйста, предложите любой возможный способ пропустить такие документы 🙂

 import xmltodict
for i in range (1000):
    with open('C:/Python27/Major Project/2000 ipsSearch.jsp.xml') as fd:
        fout = open(str(i) ".txt","w")   ## Flush old records from output file
        doc = xmltodict.parse(fd.read())
        w = doc['root']['document'][i]['rank']
        x = doc['root']['document'][i]['title']
        y = doc['root']['document'][i]['abstract']
        z = doc['root']['document'][i]['authors']
        a = doc['root']['document'][i]['affiliations']
        fout.write(str(w) "n" str(x) " " str(y) "n" str(z) "n" str(a))
  

получение ошибки, когда abstract ни в одном элементе нет элемента document .

Комментарии:

1. Теперь я вижу код 🙂 if abstrat in doc['root']['document'][i]: y = ... else: y = ''

2. Если ваш doc объект представляет собой словарь Python (как xmltodict следует из названия), вы можете использовать его get метод : y = doc['root']['document'][i].get('abstract') . Это присваивается None y , когда ключ отсутствует (чтобы изменить это значение, просто укажите default аргумент для get ).

Ответ №1:

Играйте безопасным способом — сначала проверьте, присутствует ли элемент, в противном случае назначьте пустую строку.

Теперь, поскольку проанализированный XML отображается как словарь, вы можете использовать in оператор для проверки этого, а тернарный if...else оператор по умолчанию для случаев, когда вы не можете найти abstract :

     ...
    y = doc['root']['document'][i]['abstract'] if 'abstract' in doc['root']['document'][i] else ''
    z = doc['root']['document'][i]['authors'] if 'authors' in doc['root']['document'][i] else ''
    ...
  

То же самое касается всех элементов.