You need to enable JavaScript to run this app. Python Flask调用含重音字符URL发GET请求报ASCII编码错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Python Flask调用含重音字符URL发GET请求报ASCII编码错误如何解决

错误原因

URL规范只允许包含ASCII范围内的字符,你传入的带重音的Unicode字符没有经过编码,urllib发起请求时尝试用ASCII编码转换失败,就抛出了该错误。

解决方案

有两种可选处理方式,按需选择即可:

方式1:手动对URL做百分号编码

使用Python标准库urllib.parse拆分URL的不同部分分别编码,避免破坏://、/、&等URL原生合法字符:

  • 先导入依赖模块
from urllib.parse import urlsplit, urlunsplit, quote
  • 在构造self.url前对用户传入的site参数做编码处理:
# 拆分URL为协议、域名、路径、查询参数、锚点五个部分
url_parts = list(urlsplit(raw_site))
# 处理域名中的非ASCII字符(如带重音的域名、中文域名)
url_parts[1] = url_parts[1].encode('idna').decode('ascii')
# 处理路径中的非ASCII字符
url_parts[2] = quote(url_parts[2])
# 处理查询参数,保留参数分隔符&、=不转义
url_parts[3] = quote(url_parts[3], safe='=&')
# 拼接回完整URL
self.url = urlunsplit(url_parts)

处理完成后再发起urllib请求即可正常运行。

方式2:使用requests库自动处理编码

requests库内置了URL非ASCII字符的自动编码逻辑,不需要手动处理编码规则,改造成本更低:

  • 安装requests库
    pip install requests
  • 修改请求逻辑:
import requests
def get_soup(self):
    resp = requests.get(
        self.url, 
        headers={'User-Agent' : "Mozilla/5.0 (Windows NT 6.1; Win64; x64)"}
    )
    # 自动识别响应内容编码,避免后续解析出现乱码
    resp.encoding = resp.apparent_encoding
    soup = bs.BeautifulSoup(resp.text, self.parser)
    return soup

注意:两种方式都不需要修改你现有的Flask路由规则,Flask2.x及以上版本的path类型参数会自动正确接收带非ASCII字符的路径内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 02:12:03