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

使用urllib指定下载路径时提示URL无效的问题求助

问题原因及修复方案:urllib.request.urlretrieve 参数错误导致下载失败

核心问题分析

你遇到的报错本质不是URL无效,而是对urllib.request.urlretrieve的参数理解错误,加上异常捕获逻辑过于笼统,才导致错误被误判为"invalid url":

  1. urlretrieve的第二个参数是完整的保存路径(包含文件名),而非单独的目录路径。你传入的path是目录,函数会尝试把目录当成文件写入,引发IO错误,但被统一捕获输出为"invalid url"。
  2. 你已经用os.path.join拼接了正确的完整路径location,但调用urlretrieve时完全没用到这个变量;同时urlretrieve根本没有名为filename的参数,这个错误参数会导致函数调用异常。
  3. 你覆盖了传入的local_filename参数,改成URL末尾的文件名,违背了函数接收自定义本地文件名的设计逻辑。

修复后的代码示例

import urllib.request
import re
import os
from urllib.error import URLError

mcBethURL = 'https://ia802707.us.archive.org/1/items/macbeth02264gut/0ws3410.txt'

def download_file(url, path, local_filename):
    try:
        # 获取Content-Type并判断是否为文本文件(忽略大小写)
        with urllib.request.urlopen(url) as response:
            url_type = response.info().get('content-type', '')
            if re.search(r'text', url_type, re.IGNORECASE):
                # 拼接完整的保存路径
                save_path = os.path.join(path, local_filename)
                # 确保目标目录存在,避免因目录不存在报错
                os.makedirs(path, exist_ok=True)
                # 正确调用urlretrieve:第二个参数为完整保存路径
                urllib.request.urlretrieve(url, save_path)
                print(f"文件已成功下载到:{save_path}")
            else:
                print('No text file found at given URL, download aborted!')
    except URLError as e:
        print(f"URL错误:{e.reason}")
    except IOError as e:
        print(f"文件IO错误:{e}")
    except Exception as e:
        print(f"未知错误:{e}")

download_file(mcBethURL, '/home/wilma/PycharmProjects/Uni', 'mcBeth.txt')

关键修复点说明

  • 修正urlretrieve参数传递:直接传入拼接好的完整路径save_path,不再使用错误的filename参数。
  • 保留自定义文件名逻辑:不再覆盖传入的local_filename,符合函数接收参数的设计意图。
  • 确保目录存在:添加os.makedirs(path, exist_ok=True),避免因目标目录不存在引发IO错误。
  • 细化异常捕获:拆分不同类型的异常,不再把所有错误都归为"invalid url",方便精准定位问题。
  • 优化文本类型判断:使用re.IGNORECASE忽略大小写,能匹配text/plain、TEXT/HTML等多种文本类型的Content-Type。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:25:46