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

Scrapy无数据可采集时报NoneType不可下标错误 如何将对象记录为空

你遇到的'NoneType' object is not subscriptable错误是多层索引取值时,place_data或某一层索引的返回值为None/不存在导致的。你现有的写法将整个处理逻辑放在try语句中,触发异常后仅打印错误,不会执行yield,自然无法存储对应空值字段的item。

方案1:单独捕获取值异常(推荐,代码更简洁)

仅对取值部分做异常捕获,取不到值时直接赋值为默认空值,全程都会执行yield返回item:

def parse_country(self, response):
    item = response.meta['item']
    link_id = response.meta['link_id']
    place_data = json.loads(response.body)
    
    try:
        place_country = place_data[0][0][0]
    # 覆盖取值可能遇到的所有异常:None取值的TypeError、索引越界的IndexError
    except (TypeError, IndexError):
        # 可根据你的存储需求调整默认空值,比如设为None或空字符串
        place_country = ''
    
    item['place_country'] = place_country
    yield item

方案2:逐层判断取值合法性

不想用异常捕获的话可以逐层判断数据是否存在、长度是否符合要求,再做取值:

def parse_country(self, response):
    item = response.meta['item']
    link_id = response.meta['link_id']
    place_data = json.loads(response.body)
    
    place_country = ''
    # 逐层判断非空且索引合法
    if place_data and len(place_data) > 0:
        layer1 = place_data[0]
        if layer1 and len(layer1) > 0:
            layer2 = layer1[0]
            if layer2 and len(layer2) > 0:
                place_country = layer2[0]
    
    item['place_country'] = place_country
    yield item

两种方案都可以保证爬取流程不中断,无数据时对应字段会存储你设置的默认空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:39:04