当没有数据可以为对象抓取时,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_kwargs
。 See 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)
当我 运行 我的 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_kwargs
。 See 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)