使用lxml.etree作为ET从api响应中获取文本

时间:2012-12-07 14:41:47

标签: python lxml

需要从亚马逊回应中获取文字。我认为我遇到的麻烦是找到属性的正确路径,或者至少告诉lxml如何找到它们。理想情况下,我想要每个项目的所需属性的列表或字典。我在stackoverflow How to use lxml to grab specific parts of an XML document?上发现了一个我没有开始工作的线程,得到“NameError:name'item'未定义”。我尝试将“item = {}”移出循环,得到一个空字典和None。 此外,当我打印时,我得到“元素{http://webservices.amazon.com/AWSECommerceService/2011-08-01} ItemSearchResponse在0x1032a30”,而不是ElementTree对象,不确定是否是问题的一部分。

所以我的问题是,如何让这个工作,当我这样做时,我如何遍历'items'中的所有'item',以便我获得所有返回的产品所需的属性? (或者列表是最好的解决方案)。这是我正在查看的示例xml响应的链接https://www.box.com/s/qt2kr0h4nrig68u9w07j,如果有帮助,我可以提供指向整个响应的链接。下面是获取错误的python代码,实际上只是上面提到的线程的副本。由于使用了模块,我“限制”使用lxml进行解析。

更新:链接到原始(和不间断)xml。 https://www.box.com/s/2yb1ge6rxvmzshw4pj3f

    import bottlenose
    from lxml import etree
    import lxml.etree as ET
    from pprint import pprint as pp

    t = ET.fromstring(response)
    AMAZON_NS = "{http://webservices.amazon.com/AWSECommerceService/2011-08-01}"
    TAGPOS = len(AMAZON_NS) # Find all ItemAttributes elements.
    for ia in t.iter(AMAZON_NS+'ItemAttributes'):
        item = {}
    # Iterate over all the children of the ItemAttributes node
        for elem in ia:
            # remove namespace stuff from key, remove extraneous whitepace from value
            item[elem.tag[TAGPOS:]] = elem.text.strip()
    print pp(item)

0 个答案:

没有答案