Я использую API Amazon для получения информации о книгах. Я пытаюсь использовать lxml для извлечения определенных частей документа XML, которые необходимы для моего приложения. Однако я не совсем уверен, как использовать lxml. Это насколько я понял:
root = etree.XML(response)
Чтобы создать объект etree для XML-документа.
Вот как выглядит XML-документ: http://pastebin.com/GziDkf1a На самом деле существует несколько "Элементов" , но я вставил только один из них, чтобы дать вам конкретный пример. Для каждого элемента я хочу извлечь заголовок и ISBN. Как мне сделать это с объектом etree, который у меня есть?
<ItemSearchResponse><Items><Item><ItemAttributes><Title>I want this info</Title></ItemAttributes></Item></Items></ItemSearchResponse
<ItemSearchResponse><Items><Item><ItemAttributes><ISBN>And I want this info</ISBN></ItemAttributes></Item></Items></ItemSearchResponse
По сути, я не знаю, как перемещаться по дереву с помощью моего объекта etree, и я хочу научиться этому.
Редактировать 1: я пробую следующий код:
tree = etree.fromstring(response)
for item in tree.iterfind(".//"+AMAZON_NS+"ItemAttributes"):
print(item)
print(item.items()) # Apparently, there is nothing in item.items()
for key, value in item.items():
print(key)
print(value)
Но я получаю следующий вывод: http://dpaste.com/287496/
Я добавил печать (item.items()), и это просто пустой список. Хотя каждый предмет является Элементом, но по какой-то причине у них нет предметов.
Изменить 2: я могу использовать следующий код для получения нужной информации, но похоже, что у lxml должен быть более простой способ... (этот способ не кажется очень эффективным):
for item in tree.iterfind(".//"+AMAZON_NS+"ItemAttributes"):
title_text = ""
author_text = ""
isbn_text = ""
for isbn in item.iterfind(".//"+AMAZON_NS+"ISBN"):
isbn_text = isbn.text
for title in item.iterfind(".//"+AMAZON_NS+"Title"):
title_text = title.text
for author in item.iterfind(".//"+AMAZON_NS+"Author"):
author_text = author.text
print(title_text + " by " + author_text + " has ISBN: " + isbn_text)