Python的wget.download()报HTTP Error 404,手动wget命令却正常
解决Python wget.download返回404但命令行wget正常下载的问题
问题重现
执行Python代码时触发404错误:
wget.download("http://downloads.dell.com/FOLDER06808437M/1/7760%20AIO-WIN10-A11-5VNTG.CAB")
错误详情:
File "C:\Program Files\Python39\lib\urllib\request.py", line 641, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp)urllib.error.HTTPError: HTTP Error 404: Not Found
但手动执行命令行wget可正常完成下载:
wget http://downloads.dell.com/FOLDER06808437M/1/7760%20AIO-WIN10-A11-5VNTG.CAB
问题原因
Python的wget.download依赖urllib处理请求,会对传入URL做二次编码:原URL中的%20(空格的URL编码)会被再次编码为%2520,导致服务器接收到的路径与实际资源路径不匹配,返回404。而命令行wget会直接解析%20为空格,不会重复编码,因此能正确访问资源。
解决方案
方案1:替换URL编码为实际空格
把URL里的%20换成真实空格,让wget.download自动完成一次正确编码:
import wget wget.download("http://downloads.dell.com/FOLDER06808437M/1/7760 AIO-WIN10-A11-5VNTG.CAB")
方案2:先解码URL再传入
用urllib.parse.unquote解码已编码的URL,避免二次编码:
import wget from urllib.parse import unquote url = unquote("http://downloads.dell.com/FOLDER06808437M/1/7760%20AIO-WIN10-A11-5VNTG.CAB") wget.download(url)
方案3:直接调用系统wget命令
如果环境已安装wget,通过subprocess直接调用系统命令,复用命令行的正确行为:
import subprocess subprocess.run(["wget", "http://downloads.dell.com/FOLDER06808437M/1/7760%20AIO-WIN10-A11-5VNTG.CAB"], check=True)
内容的提问来源于stack exchange,提问作者Burak Ertan
相关产品推荐
相关产品推荐

