Python解析XML转CSV时嵌套label标签数据提取失败问题咨询
问题原因
- 你使用的XPath语法错误:
xml.etree.ElementTree不支持label/0/text这种按数字索引的路径写法,要获取第N个label节点需要用findall先获取所有label节点再按索引取值,或者用XPath谓语label[1]/text(注意索引从1开始) - 你提取节点后没有调用
.text属性获取文本值,导致存的是Element对象而非实际内容 - 代码里存在变量名错误:字典赋值时用了未定义的
Code变量,应该是之前定义的Player - 直接按索引取label的风险很高,如果后续XML中label的顺序发生变化,会导致字段匹配错误,更稳妥的方式是遍历所有label节点,根据
group的内容匹配对应的text值
修正后代码(推荐:按group匹配,不受label顺序影响)
import xml.etree.ElementTree as Xet import pandas as pd cols = ["ID", "Start", "End", "Player", "Team", "Action","Half","x","y"] rows = [] # 解析XML文件 xmlparse = Xet.parse(r'/content/gdrive/MyDrive/Celtic_Dundee.xml') root = xmlparse.getroot() for instance in root: # 提取基础字段 ID = instance.find("ID").text Start = instance.find("start").text End = instance.find("end").text Player = instance.find("code").text x = instance.find("pos_x").text y = instance.find("pos_y").text # 遍历label节点,按group匹配对应值 label_map = {} for label in instance.findall("label"): group = label.find("group").text text = label.find("text").text label_map[group] = text # 从匹配字典中取对应值 Team = label_map.get("Team") Action = label_map.get("Action") Half = label_map.get("Half") # 插入行数据 rows.append({ "ID": ID, "Start": Start, "End": End, "Player": Player, "Team": Team, "Action": Action, "Half": Half, "x": x, "y": y }) df = pd.DataFrame(rows, columns=cols) # 输出到CSV df.to_csv('output.csv', index=False)
简易修正版(按索引取,仅适用于label顺序固定的场景)
如果确认所有instance下的label顺序固定为Team、Action、Half,也可以直接修改原代码中label和坐标的取值逻辑:
Team = instance.findall("label")[0].find("text").text Action = instance.findall("label")[1].find("text").text Half = instance.findall("label")[2].find("text").text x = instance.find("pos_x").text y = instance.find("pos_y").text
内容的提问来源于stack exchange,提问作者JayRSP
相关产品推荐
相关产品推荐

