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 等。以及所有项目特定标签标签,例如操作系统、屏幕大小等。我想保存this 将每个 xml 对象放入内存中,转换成适当的数据结构(对象)。最后,我想将所有 xml 对象的所有信息写入 csv 文件。

困难在于先验我不知道 csv 文件的列(标题)是什么。对于第一个 xml 对象,我将创建与项目和项目细节组合所具有的子标签数量一样多的列。

然后,随着新项目出现新列,我将添加越来越多的列,为以前未出现的列添加 NA。

我正在寻找有关如何处理 xml 对象、转换(保存)xml 对象的数据结构以及如何将所有最终处理的 xml 数据写入 csv 文件的建议。

谢谢。

4

1 回答 1

2

对于 csv 中的每一行,您应该创建一个字典。在解析 xml 时,您应该<Item>从代码片段中为每个字典填充此字典。当你这样做时,你应该保留一组键,即列……这样在文件的末尾你就会知道你有多少列和它们的标题。

这是如何做到这一点的一小段(如果数据适合内存),我将使用 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])

请注意,此解决方案假定您的密钥是唯一的,但在您的示例中,该项目有两个图片 url,如果您希望两者都显示它是可能的(因为没有什么是不可能的)只是稍微复杂一点。

如果数据不适合内存,则需要执行两遍,第一遍收集键,第二遍打印 csv ......注意,在这种情况下,您应该用另一个解析器(如sax )替换 BeautifulSoup,因为数据不适合内存

于 2012-10-25T04:50:08.700 回答