Не удивительно, что ваш код не удался. data - это список узлов, поэтому вы можете применять ElementTree методы, например, к каждому элементу этого списка, а не ко всему списку сам по себе.
Еще одна деталь, из-за которой ваш код не прошел:
- в вашей XML выборке стране является элемент root ,
- вы пытаетесь найти другой элемент страны внутри него (но такого элемента нет).
Если вы хотите найти элемент country в дереве XML, он должен быть где-то глубже .
Для моего примера я использовал следующее XML (как строковая переменная txt ):
<main>
<country>
<name>London</name>
<rank>1</rank>
<gdppc>141100</gdppc>
</country>
<country>
<name>Paris</name>
<rank>2</rank>
<gdppc>222200</gdppc>
<year>1980</year>
</country>
</main>
Для анализа я запустил:
root = et.fromstring(txt)
Затем определите вашу функцию следующим образом:
def get_age_by_name(rank):
for node in [ a for a in root.findall('.//country') if a.find('rank').text == rank ]:
for child in node:
if child.tag == 'year':
return child.text
return None
Подробности:
- Внешний для l oop перебирает список, полученный из вашего кода.
- Внутренний l oop перебирает дочерние элементы каждого элемента этого списка.
- Если текущий дочерний элемент является элементом year , возвращается его текст («положительный» регистр).
- Если ничего не найдено, Нет возвращается («отрицательный» случай).
При запуске:
print(get_age_by_name('1'))
print(get_age_by_name('2'))
Результат:
None
1980
Таким образом, у вас есть оба «отрицательный» и «положительный» результат для различных значений rank .
Edit
Последнее предложение вашего сообщения: Мне просто нужна функция для возврата Нет, когда он не находит «год» в файле XML.
Так что, если вам не важно его расположение в дереве XML, достаточно вызвать root.findtext('.//year')
:
Чтобы проверить "отрицательный" и "положительный" регистр, выполните:
print(root.findtext('.//x_year'))
print(root.findtext('.//year'))
Результат такой же, как указано выше.