当没有数据可以为对象抓取时,Scrapy 错误显示

Scrapy error show when there are no data to scrape for an object

当我 运行 我的 Scrapy 代码时,我一直收到错误“'NoneType' 对象不可订阅”。我知道对象值是None,但是如何跳过它并指示Scrapy将这个对象记录为空对象?

方法如下

def parse_country(self, response):
    try:

        item = response.meta['item']
        link_id = response.meta['link_id']
        place_data = json.loads(response.body)
        
        place_country = place_data[0][0][0]

        item['place_country'] = place_country

        yield item
    
    except Exception as e:
        print(e)    

错误仅在没有数据可抓取时显示。

Try/except 有助于捕获错误或错误。 我建议 if/else 解决方案。

类似的东西对你有用:

def parse_country(self, response):
    item = response.meta['item']
    link_id = response.meta['link_id']
    place_data = json.loads(response.body)                    
                 
    if place_data[0][0][0] is not None:
         place_country = place_data[0][0][0]
         item['place_country'] = place_country
    else
         item['place_country'] = 'No Country found'
    

请注意,使用 try 块作为控制语句不是一个好的做法。

写的时候 place_data[0][0][0] 表示您正在寻找多级嵌套列表。解决方案是检查每个级别的 None 和长度。如果这些项目中的任何一项是 None,您将遇到此错误。

解决方案是检查所有这些值。你可以像这样做一个 if 语句

if place_data and len(place_data) > 0 \
         and place_data[0] and len(place_data[0]) > 0 \
         and place_data[0][0] and len(place_data[0][0]) \
         and place_data[0][0][0]:
    item['place_country'] = place_data[0][0][0]
else:
     item['place_country'] = None

或者您可以将其分解为多个嵌套的 if 语句以提高可读性。

旁注 # 1:不建议在较新版本的 scrapy 中使用 meta。请改用 cb_kwargsSee the docs.

旁注 # 2:您可以通过调用 response.json()

直接获得 json

经过多次测试,这是适合我的代码

def parse_images(self, response):
    try:
                   
        link_id = response.meta['link_id']
        place_data = json.loads(response.body)
        item = response.meta['item']
        
        try: 
            place_country = place_data[0][0][0]
        except:
            place_country = ''

        yield {
            'link_id': link_id,
            'place_country': place_country
        }
    except Exception as e:
        print(e)