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

开发Moodle课程资料自动下载爬虫时遭遇FileNotFoundError问题求助

解决Moodle爬虫的FileNotFoundError问题

嘿,我来帮你拆解这个让人头疼的FileNotFoundError!看起来你的代码能下载部分PDF,但对某些文件失败,核心问题大概率出在文件名处理或者文件路径权限上,咱们一步步排查:

1. 先搞清楚你到底在创建什么文件

报错里的'course calendar.pdf'看起来正常,但实际生成的文件名可能藏着猫腻。先在open()之前加几行调试代码,看看真实的文件名和当前工作目录:

import os

# 在下载resources的循环里添加
for address, name in resources:
    response = s.get(address)
    size = len(name)
    # 生成文件名并打印
    filename = name[:size-5]+" .pdf"
    print(f"准备创建文件:{repr(filename)}")  # repr能显示隐藏字符
    print(f"当前脚本运行目录:{os.getcwd()}")
    # 再尝试打开文件
    with open(filename, 'wb') as f:
        f.write(response.content)

这一步能帮你排查:

  • 文件名是否包含不可见特殊字符(比如换行、制表符)
  • 脚本是否运行在你预期的目录里(比如你以为在Downloads,但实际在脚本所在的文件夹)

2. 修复文件名的两个常见问题

问题A:多余的空格

你的代码里写的是name[:size-5]+" .pdf",这里文件名和.pdf之间多了一个空格!虽然报错里显示的是'course calendar.pdf',但不排除某些name处理后会因为这个空格导致系统识别异常。先把空格去掉:

filename = name[:size-5] + ".pdf"

问题B:非法字符

Moodle的课程文件名可能包含系统不允许的字符(比如Windows下的:、/、*,或者Mac/Linux下的/),这些字符会导致系统无法创建文件。写个简单的函数清理文件名:

def sanitize_filename(filename):
    # 替换所有系统非法字符为下划线
    invalid_chars = '<>:"/\\|?*'
    for char in invalid_chars:
        filename = filename.replace(char, '_')
    # 去掉首尾的空格或不可见字符
    filename = filename.strip()
    return filename

然后用这个函数处理你的文件名:

filename = sanitize_filename(name[:size-5] + ".pdf")

3. 确保目标目录存在且有写入权限

有时候你的脚本运行目录没有写入权限,或者你想保存到的子目录还没创建。可以指定一个固定的下载目录,先创建它再保存文件:

save_directory = "moodle_course_materials"
# 创建目录,已存在的话不会报错
os.makedirs(save_directory, exist_ok=True)

# 在循环里拼接完整路径
for address, name in resources:
    response = s.get(address)
    # 先检查请求是否成功
    if response.status_code != 200:
        print(f"下载失败:{address},状态码:{response.status_code}")
        continue
    size = len(name)
    filename = sanitize_filename(name[:size-5] + ".pdf")
    # 拼接完整路径
    file_path = os.path.join(save_directory, filename)
    with open(file_path, 'wb') as f:
        f.write(response.content)
    print(f"成功保存:{file_path}")

用os.path.join()能自动处理不同系统的路径分隔符(Windows用\,Mac/Linux用/),避免路径错误。

4. 关于PDF下载的小提醒

  • 绝对不能用'w'模式替代'wb'!PDF是二进制文件,用'w'模式会破坏文件结构,导致打开失败,你之前的尝试是对的,坚持用'wb'。
  • 用with open(...)语句代替直接open(),它会自动帮你关闭文件,避免资源泄漏或文件损坏。

按照这些步骤排查,应该能解决那个奇怪的FileNotFoundError!

内容的提问来源于stack exchange,提问作者T3X3K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:02:40