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
相关产品推荐
相关产品推荐

