Използвам 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/
Добавих print(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)