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

urllib.error.URLError错误求助:网站解析下载脚本报错,不知如何用urllib.parse

解决urllib.error.URLError: unknown url type 'https>'问题

嘿,这个错误我之前帮朋友排查过,大概率是URL格式出了问题——要么是你要请求的链接里混进了多余的符号(比如不小心带了>),要么是处理相对路径转绝对路径时没做对,和Python版本、PyCharm或者OpenSSL完全没关系,咱们一步步来搞定:

1. 先排查URL本身的“脏数据”

这个错误提示里的'https>'已经很明显了:你的URL里多了个>符号!大概率是从网页解析链接时,没把HTML标签里的符号清理干净(比如原网页里是<a href="https://xxx.com">下载</a>,解析时不小心把末尾的>也带进URL里了)。

可以先给URL做个简单的清理:

# 方法1:简单清理首尾多余字符
clean_url = target_url.strip().rstrip('>')  # 去掉首尾空格和末尾的>

# 方法2:用正则更彻底清理(适合复杂情况)
import re
def clean_url(url):
    # 去掉URL首尾的非合法字符,比如<、>、空格、引号等
    return re.sub(r'^[^a-zA-Z0-9:/]+|[^a-zA-Z0-9:/]+$', '', url)

2. 正确用urljoin拼接绝对路径

很多时候从网页里爬出来的是相对路径(比如/files/report.pdf),直接用这个路径请求肯定会出错,这时候就需要urljoin把它和当前网页的基础URL拼接成合法的绝对URL:

from urllib.parse import urljoin

# 当前网页的完整URL(比如你爬的页面是https://example.com/documents/)
base_url = "https://example.com/documents/"
# 从页面里解析到的相对路径
relative_url = "/files/report.pdf"

# 拼接成绝对URL
absolute_url = urljoin(base_url, relative_url)
# 结果是:https://example.com/files/report.pdf,这才是合法的可请求链接

⚠️ 注意:base_url必须是完整的(包含https://和域名),不然urljoin可能拼接出奇怪的错误路径。

3. urlencode的正确用法(针对带参数的URL)

如果你要请求的下载链接带参数(比如https://example.com/download?id=123&name=test),可以用urlencode把参数字典编码成合法的查询字符串:

from urllib.parse import urlencode

params = {
    'id': 123,
    'name': '测试文件'
}
# 编码参数,指定utf-8避免中文乱码
encoded_params = urlencode(params, encoding='utf-8')
# 拼接成完整URL
full_url = f"https://example.com/download?{encoded_params}"

4. 优化你的get_page方法示例

把上面的逻辑整合到你的代码里,比如修改后的tools类:

import bs4 as bs
import urllib.request
from urllib.parse import urlparse, urljoin, urlencode
import re
import os

class tools():
    def clean_url(self, url):
        # 清理URL中的非法字符
        return re.sub(r'^[^a-zA-Z0-9:/]+|[^a-zA-Z0-9:/]+$', '', url)

    def get_page(self, base_url, target_url=None):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
        }
        # 处理URL:如果是相对路径转绝对路径,再清理
        if target_url:
            absolute_url = urljoin(base_url, target_url)
        else:
            absolute_url = base_url
        absolute_url = self.clean_url(absolute_url)

        try:
            req = urllib.request.Request(absolute_url, headers=headers)
            with urllib.request.urlopen(req) as response:
                return response.read()
        except urllib.error.URLError as e:
            print(f"请求失败:{e}")
            return None

最后再提醒一句:你之前重装Python、PyCharm和OpenSSL都是白费功夫哦,这个问题完全是代码里的URL处理逻辑有问题,和环境无关~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:13:37