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

如何修复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变量但没有提前定义,直接运行也会报错。

修复方案
  1. 所有从网页提取的文本,在做格式解析前统一调用.strip()方法,清除首尾的换行、空格、制表符等空白字符。
  2. 日期解析格式保持用%B %d, %Y即可,不需要为单数字日期做特殊适配。
  3. 修正代码里的变量名错误、缺失导入问题。

修复后的可运行代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:36:27