Python Scrapy:判断item是否为None及处理business_name字段过滤问题
嗨,我来帮你解决这两个Scrapy相关的问题~
问题1:如何在Python Scrapy中判断item是否为None?
其实逻辑很直接,Scrapy的Item本质是自定义类的实例,和普通Python对象一样,直接用is关键字判断即可:
# 在Spider的parse方法或Pipeline中都可以用 if item is None: # 比如跳过这个无效item return
不过更多时候你可能需要判断的是item中的某个字段是否为None,而非item本身。这种情况推荐用item.get()方法(避免字段不存在时抛出KeyError),示例如下:
# 判断business_name字段是否为None if item.get('business_name') is None: # 执行对应的处理逻辑 pass
问题2:只保留
business_name为[]的查询结果 根据你的描述,你需要过滤掉business_name为None或有实际内容的item,只保留该字段是空列表[]的结果。这里提供两种常用的实现方式:
方法1:在Spider中yield前直接过滤
在生成item后,先做条件判断,只有符合要求的item才输出:
def parse(self, response): # 假设这里是你构造item的逻辑 item = YourCustomItem() # 示例:通过xpath提取business_name,返回空列表或实际内容 item['business_name'] = response.xpath('//some/path/text()').getall() # 仅保留business_name为空列表的item if item.get('business_name') == []: yield item # 其他情况直接跳过,不输出
方法2:在Item Pipeline中统一过滤
如果想把过滤逻辑集中管理,推荐用Pipeline实现,更便于后续维护:
from scrapy.exceptions import DropItem class FilterBusinessNamePipeline: def process_item(self, item, spider): business_name = item.get('business_name') # 仅保留business_name为空列表的item,其余直接丢弃 if business_name == []: return item else: raise DropItem(f"丢弃不符合条件的item: business_name = {business_name}")
写完Pipeline后,记得在项目的settings.py中启用它:
ITEM_PIPELINES = { 'your_project_name.pipelines.FilterBusinessNamePipeline': 300, # 其他Pipeline可按优先级添加 }
关键注意点:
None == []的结果是False,所以上面的判断会自动排除business_name为None的情况,刚好匹配你只留空列表的需求。- 用
item.get('business_name')而非直接item['business_name'],能避免字段不存在时抛出异常,让逻辑更健壮。
如果之前你的代码输出不符合预期,大概率是判断逻辑写反了,调整成上面的条件就能解决问题啦。
内容的提问来源于stack exchange,提问作者BARNOWL
相关产品推荐
相关产品推荐

