如何修复Python datetime.strptime解析日期触发的ValueError报错
问题根因
你的代码报错和日期是单数字/双数字完全无关,两个报错分别来自两个基础问题:
- 第一个格式不匹配错误:你爬取到的日期文本首尾带了换行符,从报错信息
time data '\nJuly 4, 2022\n'就能直接看到,字符串前后的\n是网页元素自带的换行空白,没有清理就直接传入解析,自然匹配不上你写的格式串。 - 第二个
bad directive错误:%-d是类Unix平台(Linux/macOS)专属的无前导零日期解析指令,Windows平台的Python标准库不支持这个写法,跨平台运行必然报错。而且你完全不需要用这个指令:%d本身就可以同时解析带前导零和不带前导零的日期,不管是July 4, 2022还是July 04, 2022,用%B %d, %Y都能正常解析,之前解析失败纯粹是首尾换行符导致的。
另外你的代码还藏了两个会触发运行错误的小问题:一是没有导入BeautifulSoup库,二是查找职位列表的那行代码用了未定义的soup变量,实际你初始化的BeautifulSoup对象叫jobSoup;另外代码里引用了headers变量但没有提前定义,直接运行也会报错。
修复方案
- 所有从网页提取的文本,在做格式解析前统一调用
.strip()方法,清除首尾的换行、空格、制表符等空白字符。 - 日期解析格式保持用
%B %d, %Y即可,不需要为单数字日期做特殊适配。 - 修正代码里的变量名错误、缺失导入问题。
修复后的可运行代码如下:
import requests from bs4 import BeautifulSoup from datetime import datetime # 提前定义请求头,否则requests请求可能被站点拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } def jobScan(link): the_job = {} jobUrl = link['href'] the_job['urlLink'] = jobUrl jobs = requests.get(jobUrl, headers=headers) jobC = jobs.content jobSoup = BeautifulSoup(jobC, "lxml") # 修复变量名错误,替换不存在的soup为jobSoup table = jobSoup.find_all("a", attrs={"class": "job-details-link"}) postDate = jobSoup.find_all("span", {"class": "job-date__posted"})[0] postDate = postDate.text.strip() # 清除首尾空白字符 date_posted = datetime.strptime(postDate, '%B %d, %Y') the_job['date_posted'] = date_posted closeDate = jobSoup.find_all("span", {"class": "job-date__closing"})[0] closeDate = closeDate.text.strip() # 清除首尾空白字符 closing_date = datetime.strptime(closeDate, '%B %d, %Y') the_job['closing_date'] = closing_date return the_job
扩展优化
如果后续遇到同站点日期格式更混乱、手动写格式串适配麻烦的场景,可以用python-dateutil库的自动解析功能,不需要手动指定格式就能识别绝大多数常规日期写法,适合爬虫场景使用:
- 安装命令:
pip install python-dateutil - 用法示例:
from dateutil import parser # 自动解析日期,不需要写格式串,同样兼容单/双数字日期 date_posted = parser.parse(postDate.strip()) closing_date = parser.parse(closeDate.strip())
内容的提问来源于stack exchange,提问作者Muhumuza
相关产品推荐
相关产品推荐

