XML 解析并将解析后的标签值存储在 csv 中或 excel 中 python

XML parsing and storing the parsed tag values in csv or excel in python

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

我试图在代码中修复 3 个问题:

  1. 发送 link 的 100 个 XML 文件作为解析的输入,或访问存储了 100 个 XML 文件 link 的 csv 文件并使用它们作为输入(而不是像下面的代码那样一个一个地使用本地 XML 文件)
  2. 不解析具有相同标签名称的子/子节点(即仅解析标签的 'label'、'status' 而不是 XML 文件中的标签下)
  3. 将所有 xml 文件的解析值以 table 格式存储或发送到一个(或多个)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 格式输出:

标签 状态 开始时间
一个 不好 990

有人可以帮忙完成这项作业吗!

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')

  • 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"))