如何在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
相关产品推荐
相关产品推荐

