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

如何在Python中处理特定KeyError?Scrapy管道代码报错求助

解决Scrapy Pipeline中KeyError: 'rel'的异常处理问题

核心问题分析

你代码里的异常处理逻辑未生效,根源是str(EmptyVar)的结果是"'rel'"(包含单引号),和你判断的'rel'不匹配,导致条件永远不成立,异常分支代码从未执行。

解决方案1:修正异常判断逻辑

直接通过KeyError实例的args属性获取缺失的键名,这是更可靠的判断方式:

from lxml import etree

class CleanItem():
    def process_item(self, item, spider):
        try:
            root = etree.fromstring(str(item['external_link_body']).split("'")[1])
            dict_ = {}
            dict_.update(root.attrib)
            dict_.update({'text': root.text})
            item['external_link_rel'] = dict_["rel"]
            return item
        except KeyError as e:
            # 通过args[0]直接获取缺失的键名
            if e.args[0] == 'rel':
                item['external_link_rel'] = "null"
                return item
            # 若是其他KeyError(比如item内的键缺失),重新抛出异常不处理
            raise

解决方案2:避免异常(更推荐)

无需try-except块,直接使用字典的get()方法设置默认值,代码更简洁可读性更高:

from lxml import etree

class CleanItem():
    def process_item(self, item, spider):
        root = etree.fromstring(str(item['external_link_body']).split("'")[1])
        dict_ = {}
        dict_.update(root.attrib)
        dict_.update({'text': root.text})
        # 键不存在时自动返回默认值"null"
        item['external_link_rel'] = dict_.get('rel', 'null')
        return item

补充说明

第二种方式遵循Python的"EAFP"(优先请求宽恕而非许可)编程风格,既避免了异常捕获的冗余代码,也能直接处理键缺失的场景,是更优的实现方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:27:29