1

次の形式の XML オブジェクトが多数あります。

<GetSingleItemResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2012-10-25T03:09:50.817Z</Timestamp>
  <Ack>Success</Ack>
  <Build>E795_CORE_BUNDLED_15430047_R1</Build>
  <Version>795</Version>
  <Item>
     <Description>...</Description>
     <ItemID>330810813385</ItemID>
     <EndTime>2012-10-25T04:32:37.000Z</EndTime>
     <Location>Paypal Prefered</Location>
     <GalleryURL>...</GalleryURL>
     <PictureURL>...</PictureURL>
     <PictureURL>...</PictureURL>
     <PrimaryCategoryID>177</PrimaryCategoryID>
     <PrimaryCategoryName>
     Computers/Tablets & Networking:Laptops & Netbooks:PC Laptops & Netbooks
     </PrimaryCategoryName>
     <BidCount>2</BidCount>
     <ConvertedCurrentPrice currencyID="USD">294.99</ConvertedCurrentPrice>
     <ListingStatus>Active</ListingStatus>
     <TimeLeft>PT1H22M47S</TimeLeft>
     <Title>
     HP Compaq ZD8000 3800Mhz Full Loaded Ready to go, nice unit & super fast Laptop
     </Title>
     <ShippingCostSummary>
     <ShippingServiceCost currencyID="USD">23.99</ShippingServiceCost>
     <ShippingType>Flat</ShippingType>
     <ListedShippingServiceCost currencyID="USD">23.99</ListedShippingServiceCost>
     </ShippingCostSummary>
     <ItemSpecifics>
        <NameValueList>
           <Name>Operating System</Name>
           <Value>Windows XP Professional</Value>
        </NameValueList>
        <NameValueList>
           <Name>Screen Size</Name>
           <Value>17.0</Value>
        </NameValueList>
        <NameValueList>
           <Name>Processor Type</Name>
           <Value>Intel Pentium 4 HT</Value>
        </NameValueList>
     </ItemSpecifics>
     <Country>US</Country>
     <AutoPay>false</AutoPay>
     <ConditionID>2500</ConditionID>
     <ConditionDisplayName>Seller refurbished</ConditionDisplayName>
   </Item>
</GetSingleItemResponse>

各 xml オブジェクトについて、itemid、endtime などのすべてのアイテム タグ タグと、オペレーティング システム、画面サイズなどのすべてのアイテム固有のタグ タグを取得したいと考えています。これを各 xml オブジェクトのメモリに適切なデータ構造 (オブジェクト) に格納します。最後に、すべての xml オブジェクトのすべての情報を csv ファイルに書き込みたいと思います。

難しいのは、csv ファイルの列 (ヘッダー) がどうなるかわからないということです。最初の xml オブジェクトでは、アイテムとアイテムの詳細を組み合わせたサブタグの数と同じ数の列を作成します。

次に、新しいアイテムに新しい列が表示されるたびに列を追加し、以前に表示されていない列に NA を追加します。

xml オブジェクトを処理する方法、xml オブジェクトを変換 (保存) するデータ構造、および最終的に処理されたすべての xml データを csv ファイルに書き込む方法についてのアドバイスを探しています。

ありがとう。

4

1 に答える 1

2

csv の各行に対して、辞書を作成する必要があります。<Item>xml を解析するときに、スニペットからそれぞれに対してこのディクショナリを設定する必要があります。それを行う間、一連のキー、つまり列を保持する必要があります... そうすれば、ファイルの最後までに、列の数とそれらのタイトルがわかります。

これを行う方法の小さなスニペットを次に示します (データがメモリに収まる場合)。タグで言及されているので、私は BeautifulSoup を使用します。

import sys
import csv

from BeautifulSoup import BeautifulSoup as Soup

doc = Soup(xml_string)
data = []
cols = set()
for item in doc.findAll('item'):
    d = {}
    for sub in item:
        if hasattr(sub, 'name'):
            d[sub.name] = sub.text
    data.append(d)
    cols = cols.union(d.keys())

cw = csv.writer(sys.stdout)
cw.writerow(cols)
for row in data:
    cw.writerow([row.get(k, 'N/A') for k in cols])

このソリューションでは、キーが一意であると想定していますが、例ではアイテムに 2 つの画像 URL があり、両方を表示したい場合は可能です (不可能なことは何もないため) もう少し複雑です。

データがメモリに収まらない場合は、2 つのパスを実行する必要があります。最初のパスでキーを収集し、2 番目のパスで csv を出力します。注意してください。この場合、 BeautifulSoup をsaxなどの別のパーサーに置き換える必要があります。データがメモリに収まらない

于 2012-10-25T04:50:08.700 に答える