Python urlparse处理密码含=?的URL时报错,是字符非法还是实现问题?
问题原因说明
这个问题是Python 3.7及更早版本中urllib.parse.urlparse的实现缺陷,不是基础认证密码不允许使用=?字符。
根因分析
- RFC 3986规范中明确允许用户信息(即
user:pass部分)包含:、=、?等子分隔符,只要这些字符出现在@符号之前,就属于认证信息段的内容,不应该被误解析为主机/端口段的内容。 - 你遇到的报错是因为旧版本的
urlparse对@的边界解析逻辑出错:当密码中出现?字符时,解析器错误地提前终止了用户信息段的识别,把?@1.2.3.4:123中的:后的内容当成了端口,才会尝试把=转成整数触发报错。
解决方案
- 优先升级到Python 3.8及以上版本,该版本已经修复了这个解析bug,测试代码如下:
from urllib.parse import urlparse print(urlparse("https://a:=?@1.2.3.4:123").port) # 3.8+版本正确输出123
- 如果必须使用3.7及更低版本,可以先对URL的用户信息段做URL编码处理,解析后再解码即可避免该问题。
内容的提问来源于stack exchange,提问作者Amir Rossert
相关产品推荐
相关产品推荐

