使用ElementTree解析StackExchange XML时出现NonType回溯错误求助
解决ElementTree解析StackExchange XML转CSV的NonType错误
常见错误原因及排查步骤
- XML结构不符预期:StackExchange归档XML通常以
<users>为根节点,子节点为<row>,但部分特殊归档可能存在结构差异。先确认你的XML根节点和子节点名称是否与代码逻辑匹配。示例标准结构:
<users> <row Id="1" DisplayName="XXX" Reputation="1000" CreationDate="2020-01-01T00:00:00.000" /> </users> - 属性缺失触发None值:部分用户节点可能缺少非必填属性(如
Location、WebsiteUrl),直接提取后未处理None就写入CSV,会引发NonType相关报错。 - 文件损坏或路径错误:若XML文件下载不完整、存在截断,解析时可能返回异常,甚至获取到None类型的节点对象。
修正后的代码示例
import xml.etree.ElementTree as ET import csv # 解析XML文件 tree = ET.parse('users.xml') root = tree.getroot() # 定义需要提取的字段,包含可能缺失的属性 target_fields = ['Id', 'DisplayName', 'Reputation', 'CreationDate', 'Location', 'WebsiteUrl'] with open('users.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=target_fields) writer.writeheader() # 遍历所有用户节点(根据实际XML结构调整节点路径) for user_node in root.findall('./row'): # 提取属性,缺失时用空字符串替代None row_data = {field: user_node.get(field, '') for field in target_fields} writer.writerow(row_data)
大文件优化方案
如果XML文件体积过大,建议使用流式解析避免内存溢出:
import xml.etree.ElementTree as ET import csv target_fields = ['Id', 'DisplayName', 'Reputation'] with open('users.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=target_fields) writer.writeheader() # 流式解析XML,处理完节点立即释放内存 for event, elem in ET.iterparse('users.xml', events=('end',)): if elem.tag == 'row': row_data = {field: elem.get(field, '') for field in target_fields} writer.writerow(row_data) elem.clear()
内容的提问来源于stack exchange,提问作者Z.Edibo
相关产品推荐
相关产品推荐

