使用urllib.request.urlretrieve批量下载文件报错求助
urllib批量下载报错
unknown url type: 'https'排查思路 单文件下载正常,但批量拼接URL后触发urllib.error.URLError: <urlopen error unknown url type: 'https>错误,核心原因是拼接后的URL格式不合法,urllib无法识别正确的HTTP协议,可以按以下步骤排查:
打印并检查拼接后的URL完整性
循环中每次生成URL后,立刻用print()输出完整字符串,确认:- 必须以
https://完整开头,不能缺失://,也不能在开头/结尾残留单引号、空格等多余字符(比如如果输出是'https://xxx...,引号会被当成URL的一部分,导致协议识别失败) - 复制输出的URL到浏览器,验证是否能正常访问,排除URL本身无效的情况
- 必须以
排查字符串拼接语法错误
- 避免用Pathlib拼接网络URL:Pathlib是用于本地文件路径的工具,处理网络URL会引入格式问题,必须用字符串拼接、f-string或
str.format() - 检查基础URL是否正确:比如基础URL末尾是否多了/或者少了字符,比如错误写成
httpswww.test-download.co.uk(缺失://),拼接后整个URL协议部分失效 - 示例正确拼接方式:
base_url = "https://www.test-download.co.uk/data/LEED/2025/021/LEED00GBR_S_2025021{}_01H_30S_MO.rnx.zip" for hour in range(24): hour_str = f"{hour:04d}" # 生成0000、0100...2300格式的小时标识 full_url = base_url.format(hour_str)
- 避免用Pathlib拼接网络URL:Pathlib是用于本地文件路径的工具,处理网络URL会引入格式问题,必须用字符串拼接、f-string或
检查循环变量的格式
确保生成的小时段标识格式符合要求(比如必须是4位数字,如0100而非100),如果变量格式错误导致URL路径部分混乱,也可能间接引发协议识别问题。可以在循环中打印变量值,确认是否符合预期。验证URL编码合法性
如果URL路径中存在特殊字符(即使当前场景不明显),可以用urllib.parse.quote()对路径部分进行编码,确保URL格式符合HTTP规范:from urllib.parse import quote path = f"LEED00GBR_S_2025021{hour_str}_01H_30S_MO.rnx.zip" encoded_path = quote(path) full_url = f"https://www.test-download.co.uk/data/LEED/2025/021/{encoded_path}"运行极简测试代码
写一个只循环2-3个小时的极简批量代码,排除循环逻辑中的复杂干扰,比如:import urllib.request for hour in ["0000", "0100"]: url = f"https://www.test-download.co.uk/data/LEED/2025/021/LEED00GBR_S_2025021{hour}_01H_30S_MO.rnx.zip" save_path = f"C:/temp/data/2025021/LEED00GBR_S_2025021{hour}_01H_30S_MO.rnx.zip" print(url) urllib.request.urlretrieve(url, save_path)如果这段代码报错,直接检查打印的URL;如果正常,再逐步还原原代码的逻辑,定位问题点。
内容的提问来源于stack exchange,提问作者cappo
相关产品推荐
相关产品推荐

