2012-01-03 5 views
1

でXMLを解析、これはXML私はAmazonの商品広告APIからのXMLレスポンスを解析しようとしていますetree

<?xml version="1.0" ?> 
    <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2010-11-01"> <OperationRequest> 
     <HTTPHeaders> 
      <Header Name="UserAgent" Value="TSN (Language=Python)"></Header> 
     </HTTPHeaders> 
     <RequestId>96ef9bc3-68a8-4bf3-a2c7-c98b8aeae00f</RequestId> 
     <Arguments> 
      <Argument Name="Operation" Value="ItemLookup"></Argument> 
      <Argument Name="Service" Value="AWSECommerceService"></Argument> 
      <Argument Name="Signature" Value="gjc4wRNum3YT82app1d06vMIDM7v44fOmZTP8Uh3LqE="></Argument><Argument Name="AssociateTag" Value="sneakick-20"></Argument> 
      <Argument Name="Version" Value="2010-11-01"></Argument> 
      <Argument Name="ItemId" Value="810056013349,810056013264"></Argument> 
      <Argument Name="IdType" Value="UPC"></Argument> 
      <Argument Name="AWSAccessKeyId" Value="AKIAIFMUMJLJOOINRVRA"></Argument> 
      <Argument Name="Timestamp" Value="2012-01-03T21:26:39Z"></Argument> 
      <Argument Name="ResponseGroup" Value="ItemIds"></Argument> 
      <Argument Name="SearchIndex" Value="Apparel"></Argument> 
     </Arguments> 
     <RequestProcessingTime>0.0595830000000000</RequestProcessingTime> 
     </OperationRequest> 
     <Items> 
      <Request> 
       <IsValid>True</IsValid> 
       <ItemLookupRequest> 
        <IdType>UPC</IdType> 
        <ItemId>810056013349</ItemId> 
        <ItemId>810056013264</ItemId> 
        <ResponseGroup>ItemIds</ResponseGroup> 
        <SearchIndex>Apparel</SearchIndex> 
        <VariationPage>All</VariationPage> 
       </ItemLookupRequest> 
      </Request> 
      <Item> 
       <ASIN>B000XR4K6U</ASIN> 
      </Item> 
      <Item> 
       <ASIN>B000XR2UU8</ASIN> 
      </Item> 
     </Items> 
    </ItemLookupResponse> 

である私が興味を持ってすべてがとても基本的にすべてのXMLはだった、アイテム内のアイテムのタグです私はそのように解析された文字列にアマゾンで返さ:

from xml.etree.ElementTree import fromstring 

response = "xml string returned by amazon" 
parsed = fromstring(response) 
items = parsed[1] # This is how i get the Items element 

# These were my attempts at getting the Item element 
items.find('Item') 
items.findall('Item') 

アイテム素子であるアイテムが、今のところありません成功、それはなし/空、イム私は何かが足りないを返し続ける、または行くための別の方法がありますこれについて ?

+1

解析コード部分を表示すると便利です。 –

+0

質問を編集しました:P – Paulo

答えて

4

これは名前空間の問題です。これは動作します:

from xml.etree import ElementTree as ET 

XML = """<?xml version="1.0" ?> 
    <ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2010-11-01"> 
     <OperationRequest> 
     <HTTPHeaders> 
      <Header Name="UserAgent" Value="TSN (Language=Python)"></Header> 
     </HTTPHeaders> 
     <RequestId>96ef9bc3-68a8-4bf3-a2c7-c98b8aeae00f</RequestId> 
     <Arguments> 
      <Argument Name="Operation" Value="ItemLookup"></Argument> 
      <Argument Name="Service" Value="AWSECommerceService"></Argument> 
      <Argument Name="Signature" Value="gjc4wRNum3YT82app1d06vMIDM7v44fOmZTP8Uh3LqE="></Argument> 
      <Argument Name="AssociateTag" Value="sneakick-20"></Argument> 
      <Argument Name="Version" Value="2010-11-01"></Argument> 
      <Argument Name="ItemId" Value="810056013349,810056013264"></Argument> 
      <Argument Name="IdType" Value="UPC"></Argument> 
      <Argument Name="AWSAccessKeyId" Value="AKIAIFMUMJLJOOINRVRA"></Argument> 
      <Argument Name="Timestamp" Value="2012-01-03T21:26:39Z"></Argument> 
      <Argument Name="ResponseGroup" Value="ItemIds"></Argument> 
      <Argument Name="SearchIndex" Value="Apparel"></Argument> 
     </Arguments> 
     <RequestProcessingTime>0.0595830000000000</RequestProcessingTime> 
     </OperationRequest> 
     <Items> 
      <Request> 
       <IsValid>True</IsValid> 
       <ItemLookupRequest> 
        <IdType>UPC</IdType> 
        <ItemId>810056013349</ItemId> 
        <ItemId>810056013264</ItemId> 
        <ResponseGroup>ItemIds</ResponseGroup> 
        <SearchIndex>Apparel</SearchIndex> 
        <VariationPage>All</VariationPage> 
       </ItemLookupRequest> 
      </Request> 
      <Item> 
       <ASIN>B000XR4K6U</ASIN> 
      </Item> 
      <Item> 
       <ASIN>B000XR2UU8</ASIN> 
      </Item> 
     </Items> 
    </ItemLookupResponse>""" 

NS = "{http://webservices.amazon.com/AWSECommerceService/2010-11-01}" 

doc = ET.fromstring(XML) 
Item_elems = doc.findall(".//" + NS + "Item") # All Item elements in document 

print Item_elems 

出力:

[<Element '{http://webservices.amazon.com/AWSECommerceService/2010-11-01}Item' at 0xbf0c50>, 
<Element '{http://webservices.amazon.com/AWSECommerceService/2010-11-01}Item' at 0xbf0cd0>] 

バリエーション近い独自のコードに:

NS = "{http://webservices.amazon.com/AWSECommerceService/2010-11-01}" 
doc = ET.fromstring(XML) 
items = doc[1]       # Items element 

first_item = items.find(NS + 'Item')  # First direct Item child 
all_items = items.findall(NS + 'Item') # List of all direct Item children 
+0

ありがとうございました:P – Paulo

+0

私はこの+10をupvoteできますか?ちょうど最後のコードサンプルのため。良い例は何とか見つからないほど難しいです。 – sjas

1

名前空間の問題。

ネームスペースは、すべてのアイテムの前に、最初の回答の場合はthis questionまたはthis questionのいずれかにすることができます。あなたは、あなたがまたlxmlをチェックアウトするに興味がある可能性があり、XMLで多くの作業を行っていることが判明した場合

xml_hacked_namespace = raw_xml.replace(' xmlsn=', ' xmlnamespace=') 
doc = fromstring(xml_hacked_namespace) 
item_list = doc.findall('.//Item') 

:おそらく簡単な解決策は、このような迅速なハックで名前空間を無視することです。それはより速く、いくつかの素晴らしいメソッドを提供します。

関連する問題