【问题标题】:How to iterate over an xml and save it into a dataframe in Python?如何遍历 xml 并将其保存到 Python 中的数据框中?
【发布时间】:2021-02-11 23:19:47
【问题描述】:

我有一个XML,我正在尝试对其进行迭代并将其(只是tracking events 部分)保存到dataframe 中。

这是input XML:

<?xml version="1.0" encoding="UTF-8"?>
<trackingresponse>
   <trackingdetails>
      <trackingdetail>
         <trackingnumber>1550161004</trackingnumber>
         <trackingevents>
            <trackingevent>
               <date>2020-10-21T11:04:00+01:00</date>
               <code>17</code>
            </trackingevent>
            <trackingevent>
               <date>2020-10-21T08:41:00+01:00</date>
               <code>18</code>
            </trackingevent>
    </trackingdetail>
   </trackingdetails>
</trackingresponse>

我试过这段代码,但它显示空数据框:

    response =requests.post(endpoint_url, data=t, headers = headers).text
    # response is correct
    response_tree = ET.fromstring(response)
    data = []
    for el in response_tree.iter('./*'):
        for i in el.iter('*'):
            data.append(dict(i.items()))

    df = pd.DataFrame(data)
    print(df)

我也尝试将text 值写入临时数据帧,但这也不会:

response_df = pd.read_csv('/home/test.csv')
response_df['date']= response_tree.find('.//date').text
response_df['code']= response_tree.find('.//code').text

我也试过这个,但它给了我所有元素作为一个新行:

for child in tree.iter('trackingevent'): 
  for elem in child.iter():
       data = {str(elem.tag):[elem.text]}
       if str(elem.text)=='None':continue
       response_df = pd.DataFrame(data)
       consolidated_list.append(response_df)

我只是想将xml 中的tracking events 变成dataframe

预期的数据框:


date                              code
2020-10-21T11:04:00+01:00         17
2020-10-21T08:41:00+01:00         18

【问题讨论】:

    标签: python python-3.x xml dataframe elementtree


    【解决方案1】:

    下面的代码完成了这项工作

    import xml.etree.ElementTree as ET
    import pandas as pd
    
    xml = '''<?xml version="1.0" encoding="UTF-8"?>
    <trackingresponse>
       <trackingdetails>
          <trackingdetail>
             <trackingnumber>1550161004</trackingnumber>
             <trackingevents>
                <trackingevent>
                   <date>2020-10-21T11:04:00+01:00</date>
                   <code>17</code>
                </trackingevent>
                <trackingevent>
                   <date>2020-10-21T08:41:00+01:00</date>
                   <code>18</code>
                </trackingevent>
              </trackingevents>
          </trackingdetail>
       </trackingdetails>
    </trackingresponse>'''
    
    root = ET.fromstring(xml)
    data = [{'date': e.find('date').text, 'code': e.find('code').text} for e in root.findall('.//trackingevent')]
    df = pd.DataFrame(data)
    print(df)
    

    输出

                            date code
    0  2020-10-21T11:04:00+01:00   17
    1  2020-10-21T08:41:00+01:00   18
    

    【讨论】:

      【解决方案2】:

      您可以使用此示例来解析带有etree 的XML(注意:您的XML sn-p 中缺少&lt;/trackingevents&gt;,可能是错字):

      import pandas as pd
      import xml.etree.ElementTree as et
      
      tree = et.ElementTree(file='<your file.xml>')
      
      data = []
      for ev in tree.findall('.//trackingevent'):
          date = ev.find('date').text
          code = ev.find('code').text
          data.append({
              'date': date,
              'code': code
          })
      
      df = pd.DataFrame(data)
      print(df)
      

      打印:

                              date code
      0  2020-10-21T11:04:00+01:00   17
      1  2020-10-21T08:41:00+01:00   18
      

      【讨论】:

      • for ev in response.findall('.//trackingevent'): 'str' object has no attribute 'findall'
      猜你喜欢
      • 2022-11-14
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      相关资源
      最近更新 更多