将XML解析为数据帧

时间:2018-03-07 15:57:40

标签: xml pandas parsing

我在解析某些XML时遇到了一些麻烦。这就是XML的样子。

<listing>
   <seller_info>
       <seller_name> cubsfantony</seller_name>
       <seller_rating> 848</seller_rating>
   </seller_info>
   <payment_types>Visa/MasterCard, Money Order/Cashiers Checks, Personal Checks, See item description for payment methods accepted
   </payment_types>
   <shipping_info>Buyer pays fixed shipping charges, Will ship to United States only
   </shipping_info>
   <buyer_protection_info>
   </buyer_protection_info>
   <auction_info>
     <current_bid>$620.00 </current_bid>
     <time_left> 4 days, 14 hours +  </time_left>
     <high_bidder> 
        <bidder_name> gosha555@excite.com </bidder_name>
        <bidder_rating>-2 </bidder_rating>
     </high_bidder>
     <num_items>1 </num_items>
     <num_bids>  12</num_bids>
     <started_at>$1.00 </started_at>
     <bid_increment> </bid_increment>
     <location> USA/Chicago</location>
     <opened> Nov-27-00 04:57:50 PST</opened>
     <closed> Dec-02-00 04:57:50 PST</closed>
     <id_num> 511601118</id_num>
     <notes>  </notes>
   </auction_info>
   <bid_history>
       <highest_bid_amount>$620.00   </highest_bid_amount>
       <quantity> 1</quantity>
   </bid_history>
   <item_info>
      <memory> 256MB PC133 SDram</memory>
      <hard_drive> 30 GB 7200 RPM IDE Hard Drive</hard_drive>
      <cpu>Pentium III 933 System  </cpu>
      <brand> </brand>
      <description> NEW Pentium III 933 System - 133 MHz BUS Speed Pentium Motherboard.....
      </description>
   </item_info>
</listing>

这是我的代码。我想在标签之间传递文本并将其放入Pandas数据帧中。完整XML中大约有20个列表。对于此代码,我只是想看看如何通过标签的名称提取文本,但我不确定如何去做它

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os

from lxml import etree


ebay = etree.parse('ebay.xml') 
tree = ebay.getroot()


for child in tree:
    for element in child:
        person_dict = {}
        for more in element:
            if more.text != None:
                person_dict[more] = more.text.strip

1 个答案:

答案 0 :(得分:1)

在这里,我举一个如何解析一个给定列表的例子。如果您有多个列表,则可以使用for循环遍历所有列表。

from lxml import etree

listing = etree.parse('ebay.xml') 

d = {}
for e in listing.getchildren():
    for c in e.getchildren():
        if len(c.getchildren()) == 0:
            if c.tag is not None:
                d[c.tag] = c.text
        else:
            for ce in c.getchildren():
                if ce.tag is not None:
                    d[ce.tag] = ce.text

在此处,您可以将d附加到列表中,然后使用pandas将其转换为数据框。

输出如下所示

{'bid_increment': ' ',
 'bidder_name': ' gosha555@excite.com ',
 'bidder_rating': '-2 ',
 'brand': ' ',
  ...
 'seller_name': ' cubsfantony',
 'seller_rating': ' 848',
 'started_at': '$1.00 ',
 'time_left': ' 4 days, 14 hours +  '}