开发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
相关产品推荐
相关产品推荐

