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

