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

Python处理XML转CSV时出现NoneType不可迭代TypeError错误求助

报错核心原因

你在处理sources字段的逻辑末尾,把已经通过add_source_reference初始化好的列表属性,主动覆盖成了None,触发了迭代错误:

  1. 在attr == 'sources'的分支里,你写了value = None
  2. 分支执行完后,统一执行setattr(self, attr, value),也就是直接把self.sources赋值为None
  3. 后续再次调用add_source_reference执行if index not in self.sources判断时,自然就会报NoneType不可迭代的错误

其他潜在问题

  • 如果XML结构里S_REF标签出现在SRC_MOT标签之前,你拿到的ref[0]会是None,存入的源数据会丢失唯一键
  • 依赖AttributeError捕获来初始化self.sources的逻辑不够稳妥,容易出现异常场景下的属性缺失

修复方案

修改start方法中sources分支的逻辑,不要覆盖self.sources为None:

def start(self, e):
    if e.tag in self.OLDS.keys():
        attr = self.OLDS[e.tag]
        value = e.text.strip() if e.text else e.text
        if ( attr == 'create_date' or attr == 'modify_date' ):
            value = format_date(e.get('display'))
        elif attr == 'nom_note' or attr == 'auteur':
            value = '|'.join(value.split('_RS_'))
        elif attr == 'sources':
            # 提前初始化sources属性,避免后续捕获异常创建
            if not hasattr(self, 'sources'):
                setattr(self, 'sources', [])
            ref = (None, None)
            for child in e.iterdescendants():
                if child.tag == 'SRC_MOT':
                    ref = (child.text, ref[1])
                elif child.tag == 'S_REF':
                    # 提前校验唯一键是否存在,避免存入无效数据
                    if ref[0] is None:
                        continue
                    refs = child.text.split(';')
                    for part in refs:
                        r = part.strip()
                        r = ' '.join(r.split())
                        self.add_source_reference((ref[0], r))
            # 不要把value设为None,直接用已经维护好的sources列表
            value = getattr(self, 'sources', [])
        setattr(self, attr, value)
    return None

如果不需要把sources列表直接存入最终的CSV字段,可以直接删掉sources分支里的value赋值,以及最后的通用setattr逻辑里针对sources的处理即可。

内容的提问来源于stack exchange,提问作者Linus_Minus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 03:54:03