如何解析含缺失子项的XML文件并转换为DataFrame?
解决SimpleXML转Pandas DataFrame时的字段缺失与列错位问题
问题根源
原代码的核心问题是将所有同标签的元素单独提取为独立列表,没有将字段与对应的<ns0:Report_Entry>条目绑定。当部分条目缺失ns0:userPrincipalName这类子项时,对应标签列表的长度会短于employeeID列表,循环时就会触发IndexError,同时还会导致不同条目间的数据错位匹配。
修正后的代码
from bs4 import BeautifulSoup import pandas as pd # 读取并解析XML文件 with open(wdpath + 'wd.xml', 'r') as wd: soup = BeautifulSoup(wd.read(), 'xml') # 获取所有Report_Entry节点 report_entries = soup.find_all('ns0:Report_Entry') data = [] for entry in report_entries: # 提取当前条目的字段,缺失则填充N/A emp_id = entry.find('ns0:employeeID').get_text() if entry.find('ns0:employeeID') else 'N/A' email = entry.find('ns0:userPrincipalName').get_text() if entry.find('ns0:userPrincipalName') else 'N/A' country = entry.find('ns0:country').get_text() if entry.find('ns0:country') else 'N/A' company = entry.find('ns0:company').get_text() if entry.find('ns0:company') else 'N/A' # 将当前条目数据加入列表 data.append({ 'EmployeeID': emp_id, 'Email': email, 'Country': country, 'Company': company }) # 转换为DataFrame并保存 ri = pd.DataFrame(data) ri.to_csv(outpath + 'Report_' + cdt + '.csv', index=False)
代码说明
- 按条目遍历:直接定位所有
<ns0:Report_Entry>节点,确保每个字段都属于当前条目,从根源避免数据错位。 - 字段缺失处理:对每个字段使用
if-else判断,若当前条目找不到对应子标签,就用'N/A'填充。 - 字典式数据收集:用字典存储每个条目的字段,后续转DataFrame时自动匹配列名,无需手动对齐顺序。
- 文件操作优化:使用
with语句自动管理文件资源,避免遗漏关闭文件。
内容的提问来源于stack exchange,提问作者Jeff Jelen
相关产品推荐
相关产品推荐

