pydantic 字段缺失时触发 validationerror:必填字段(field(...))缺失即抛出异常;空字符串需用 field_validator 或 aftervalidator.strip() 处理;别名映射用 alias,多别名需 model_validator;错误定位用 exc.errors() 提取 loc 字段。

字段缺失时 ValidationError 怎么触发?
Pydantic 默认严格校验所有字段,只要数据里缺了 Field(...) 声明的必填项,解析时立刻抛出 ValidationError。比如爬虫返回 {"title": "Python教程"},但模型定义了 url: str 且没设默认值,就会报错。
实操建议:
- 用
Field(...)明确标出爬虫必须抓到的字段(如title,url,publish_time) - 对可选字段(如
author可能为空),用Optional[str]+Field(None),避免因缺失导致整个 item 失效 - 别依赖
dict.get()后再传给模型——先让 Pydantic 自己处理缺失,它比手动补None更可靠
怎么处理爬虫常见的空字符串或空白字段?
爬虫常把 " "、""、" " 当作有效值传进来,但业务上这和缺失等价。Pydantic 的 str 类型默认不剔除空白,得显式加约束。
实操建议:
- 用
str.strip()配合field_validator:在字段上加@field_validator("title"),函数里写if not v.strip(): raise ValueError("title cannot be blank") - 或者直接用
constr(strip_whitespace=True, min_length=1),但注意constr在 Pydantic v2 中已弃用,v2 推荐用AfterValidator+str.strip - 警惕
None和空字符串混用:如果字段允许None,校验函数开头先if v is None: return v,否则v.strip()会报AttributeError
爬虫字段名和模型字段名不一致怎么办?
网页结构变来变去,今天叫 article_title,明天可能变成 post_name,硬改模型字段名成本高。Pydantic 支持别名映射,但要注意反序列化方向。
实操建议:
- 用
alias参数:定义title: str = Field(..., alias="article_title"),这样传入{"article_title": "xxx"}能自动映射 - 别名只影响输入解析,不影响输出字段名——导出 JSON 时还是用
title,不是article_title - 如果多个别名都要支持(比如兼容历史数据),得自己写
@model_validator(mode="before"),检查字典里是否存在任一别名键,再重映射 - 别在 alias 里写正则或复杂逻辑——Pydantic 不支持,得退回到 pre-validator 里做
验证失败后怎么拿到具体哪个字段错了?
ValidationError 对象本身有详细信息,但默认打印很冗长,调试时难定位。爬虫批量解析几百条,不能靠肉眼扫 traceback。
实操建议:
- 捕获异常后调用
exc.errors(),返回列表,每项含loc(字段路径)、msg(错误原因)、type(错误类型),例如[{"loc": ["url"], "msg": "Field required", "type": "missing"}] - 快速提取问题字段:
[e["loc"][0] for e in exc.errors()]得到["url", "title"] - 别用
str(exc)解析错误信息——格式不稳定,不同版本输出可能变化 - 线上环境建议记录
exc.json()到日志,方便后续按字段聚合分析爬虫稳定性
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











