You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:12:18