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 个问题:
- 发送 link 的 100 个 XML 文件作为解析的输入,或访问存储了 100 个 XML 文件 link 的 csv 文件并使用它们作为输入(而不是像下面的代码那样一个一个地使用本地 XML 文件)
- 不解析具有相同标签名称的子/子节点(即仅解析标签的 'label'、'status' 而不是 XML 文件中的标签下)
- 将所有 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"))
你好,我正在学习 Python 编程,我正在尝试解析 100 个 XML 文件,只提取所需的标签及其值,并将它们存储为可读格式,如 csv 或 excel。 我正在使用 ElementTree,但它也会解析子节点。并使用 DataFrame 将解析后的数据存储在 csv 中,但只有最后一个值是 stored.Can 有人请帮忙解析和存储值吗?
我试图在代码中修复 3 个问题:
- 发送 link 的 100 个 XML 文件作为解析的输入,或访问存储了 100 个 XML 文件 link 的 csv 文件并使用它们作为输入(而不是像下面的代码那样一个一个地使用本地 XML 文件)
- 不解析具有相同标签名称的子/子节点(即仅解析标签的 'label'、'status' 而不是 XML 文件中的标签下)
- 将所有 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"))