You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫抓取结果为null或空值时如何为各字段设置默认值

Scrapy 抓取字段缺省值设置方案

你当前的写法存在两个已知问题:

  1. 当选择器未匹配到内容时,get() 会返回 None,后续直接调用 .strip() 会触发 AttributeError 报错
  2. 无法统一处理 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:45:02