Scrapy爬虫抓取结果为null或空值时如何为各字段设置默认值
Scrapy 抓取字段缺省值设置方案
你当前的写法存在两个已知问题:
- 当选择器未匹配到内容时,
get()会返回None,后续直接调用.strip()会触发AttributeError报错 - 无法统一处理
None、空字符串、--这类无效占位值的替换需求
你可以封装一个通用提取函数,统一处理字段清洗和默认值赋值逻辑,修改后的完整代码如下:
import scrapy class UfcscraperSpider(scrapy.Spider): name = 'ufcscraper' start_urls = ['http://ufcstats.com/statistics/fighters?char=a'] # 通用字段提取函数 def extract_field(self, selector, css_exp, default='', invalid_values=('','--')): # 先拿原始值,拿不到直接返回默认值 raw_val = selector.css(css_exp).get(default=default) # 处理空白字符 cleaned_val = raw_val.strip() if hasattr(raw_val, 'strip') else raw_val # 清洗后的值属于无效值则返回默认值,否则返回清洗后的值 return cleaned_val if cleaned_val not in invalid_values else default def parse(self, response): for user_info in response.css(".b-statistics__table-row")[2::]: result = { "fname": self.extract_field(user_info, "td:nth-child(1) a::text", default="未收录"), "lname": self.extract_field(user_info, "td:nth-child(2) a::text", default="未收录"), # 别名字段缺省默认设为无别名 "nname": self.extract_field(user_info, "td:nth-child(3) a::text", default="无别名"), # 身高缺省默认设为无数据 "height": self.extract_field(user_info, "td:nth-child(4)::text", default="无数据"), "weight": self.extract_field(user_info, "td:nth-child(5)::text", default="无数据"), "reach": self.extract_field(user_info, "td:nth-child(6)::text", default="无数据"), # 站位缺省默认设为未知 "stance": self.extract_field(user_info, "td:nth-child(7)::text", default="未知"), "win": self.extract_field(user_info, "td:nth-child(8)::text", default="0"), "lose": self.extract_field(user_info, "td:nth-child(9)::text", default="0"), "draw": self.extract_field(user_info, "td:nth-child(10)::text", default="0") } yield result
修改后你给出的第一条示例数据会自动处理为:
{"fname": "Tom", "lname": "Aaron", "nname": "无别名", "height": "无数据", "weight": "155 lbs.", "reach": "无数据", "stance": "未知", "win": "5", "lose": "3", "draw": "0"}
如果需要调整不同字段的默认值,只需要修改对应字段调用 extract_field 时传入的 default 参数即可,也可以自定义无效值列表过滤其他不需要的占位内容。
内容的提问来源于stack exchange,提问作者oyerohabib
相关产品推荐
相关产品推荐

