【问题标题】:XML parsing and storing the parsed tag values in csv or excel in pythonXML解析并将解析的标签值存储在csv或python中的excel中
【发布时间】:2021-10-07 01:49:13
【问题描述】:

您好,我正在学习 Python 编程,我正在尝试解析 100 个 XML 文件,仅提取所需的标签及其值并将它们存储为 csv 或 excel 等可读格式。 我正在使用 ElementTree 但它也解析子子节点。并使用 DataFrame 将解析后的数据存储在 csv 中,但只存储最后一个值。有人可以帮忙解析和存储值吗?

我试图在代码中修复三件事:

  1. 发送 100 个 XML 文件的链接作为解析的输入,或访问存储了 100 个 XML 文件链接的 csv 文件并将它们用作输入(而不是像下面的代码中一样使用本地 XML 文件)
  2. 不要解析具有相同标签名称的子/子节点(即只解析标签的“标签”、“状态”,而不是下面 XML 文件中的标签)
  3. 将所有 xml 文件中的解析值以表格式存储或发送到一个(或多个)csv 或 excel 文件,其中标签名称为列,其值为行。
import pandas as pd
import numpy as np
import xml.etree.cElementTree as et

tree=et.parse(r'C:\Users\admin\Downloads\test.xml')
root=tree.getroot()

Label = []
Status = []
StartTime = []

count=0
if count==0:
 for lbl in root.iter('label'):
  print(lbl.text)
  Label.append(lbl.text)
  count=count+1
  
count1=0  
if count1==0:
 for sts in root.iter('status'):
  print(sts.text)
  Status.append(sts.text)
  count1=count1+1

count2=0  
if count2==0:
 for st in root.iter('startTime'):
  print(st.text)
  StartTime.append(st.text)
  count2=count2+1

Jobs_df = pd.DataFrame(list(zip(Label,Status,StartTime,EndTime,Audio)),
                      columns=['Label','Status','StartTime','EndTime','Audio'])
Jobs_df.to_csv("pyXML.csv")

我的 XML 文件:

<session>
 <meta>
 <xmlURL>https://s3.amazonaws.com/test.xml</xmlURL>
 </meta>
 <server/>
 <result>
  <audio>
   <startTime>0</startTime>
    <endTime>5880</endTime>
   </audio>
   <words>
     <word>
       <label>a</label>
        <status>BAD</status>
        <score>0.0</score>
        <startTime>990</startTime>
        <children/>
         <phonemes>
           <phoneme>
            <label>AH</label>
            <status>BAD</status>
            <evaluation>SUBSTITUTION</evaluation>
            </phoneme>
          </phonemes>
      </word>
    </words>
 </result>
</session>
.
.
.
and so on..

要求以 csv 或 excel 格式输出:

label status startTime
a Bad 990

有人可以帮忙完成这个任务吗!

【问题讨论】:

    标签: python pandas xml-parsing elementtree


    【解决方案1】:
    from os import stat
    import xml.etree.ElementTree as et
    import urllib.request as rq
    
    csv_delimiter = ','
    
    def parse_xml(data):
        tree = et.fromstring(data)
        root = tree.getroot()
        label = root.find('./result/words/word/label').text
        status = root.find('./result/words/word/status').text
        startTime = root.find('./result/words/word/startTime').text
    
        with open('data.csv', '+a') as f:
            f.write(label + csv_delimiter + status + csv_delimiter + startTime + '\n')
    
    
    
    def grab_xml_url(csv_file_with_xml_file_links):
        with open('data.csv', 'w') as f:
            f.write('Label' + csv_delimiter + 'Status' + csv_delimiter + 'StartTime\n')
    
        with open(csv_file_with_xml_file_links, 'r') as f:
            try:
                for link in f:
                    fl = rq.urlopen(link)
                    data = fl.read().decode('utf-8')
                    parse_xml(data)
            except:
                pass
    
    
    grab_xml_url('path/of/the/xml/links/file.csv')
    
    

    grab_xml_url 是一个函数,它逐行读取带有 xml 文件链接的 csv 文件,从互联网上抓取它们的内容并将它们的内容传递给 parse_xml 函数。这就是为什么你必须创建带有链接的 csv 文件

    --

    ##单个xml文件

    from os import stat
    import xml.etree.ElementTree as et
    import urllib.request as rq
    
    csv_delimiter = ','
    
    def parse_xml(filePath):
        tree = et.parse(filePath)
        root = tree.getroot()
        label = root.find('./result/words/word/label').text
        status = root.find('./result/words/word/status').text
        startTime = root.find('./result/words/word/startTime').text
    
        with open('data.csv', 'w') as f:
            f.write('Label' + csv_delimiter + 'Status' + csv_delimiter + 'StartTime\n')
            f.write(label + csv_delimiter + status + csv_delimiter + startTime + '\n')
        
    parse_xml('./tree.xml')
    
    

    【讨论】:

    • 谢谢!这确实创建了一个列名为 'Label' 等的 csv 文件,但它下面没有 XML 解析值
    • 我上面的代码适用于您编写的多个 xml 文件。让我更改我的代码以在您的情况下仅解析单个 xml 文件。
    • 非常感谢!我正在寻找多个 XML 文件,它已经开始工作,但它只解析 XML 文件中第一次出现的 标记。我在 /result/words 下有多个 标签。是否有任何解决方案。
    • 你能放一个带有多个单词标签的示例xml文件吗?
    【解决方案2】:
    • pandas 1.3.0 中的新功能read_xml()
    • 这可用于简化您的解决方案
    xml = """<session>
     <meta>
     <xmlURL>https://s3.amazonaws.com/test.xml</xmlURL>
     </meta>
     <server/>
     <result>
      <audio>
       <startTime>0</startTime>
        <endTime>5880</endTime>
       </audio>
       <words>
         <word>
           <label>a</label>
            <status>BAD</status>
            <score>0.0</score>
            <startTime>990</startTime>
            <children/>
             <phonemes>
               <phoneme>
                <label>AH</label>
                <status>BAD</status>
                <evaluation>SUBSTITUTION</evaluation>
                </phoneme>
              </phonemes>
          </word>
        </words>
     </result>
    </session>"""
    
    import pandas as pd
    import io
    from pathlib import Path
    
    df = pd.read_xml(io.StringIO(xml), xpath="/session/result/words/word")
    
    df.loc[:,["label","status","startTime"]].to_csv(Path.cwd().joinpath("SO.csv"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 2018-06-09
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多