应使用标准库解析url参数:先用urlparse(url).query提取查询字符串,再用unquote_plus解码,最后用parse_qs或parse_qsl解析;注意空值、重复键及安全取值。

直接用字符串切片或 split 处理 URL 参数,看似简单,实则容易出错。URL 查询参数有编码、空值、重复键、特殊字符等细节,硬拆会漏掉 %20、+、& 在路径中误判、空参数被忽略等问题。真正可靠的方式是交给标准库,但理解底层逻辑能帮你避开典型陷阱。
先提取 query 部分,别跳过 urlparse
完整 URL 中的查询参数只在 ? 后面、# 前面 这一段。不能直接对整个 URL 字符串做 find 或 split。
- 用
urlparse(url).query安全拿到原始 query 字符串(不含 ?) - 如果 URL 没有 ?,
.query返回空字符串,不会报错 - 注意 fragment(# 后内容)和 path 中可能含 ?,仅靠字符串操作无法区分
解码必须在解析前完成
parse_qs 和 parse_qsl 不负责解码,它们默认处理的是已解码的字符串。原始 query 里中文、空格、斜杠等都以 %xx 形式存在,不先解码就会得到乱码或错误结构。
- 中文、空格、斜杠等:用
unquote - 表单提交中常见的 + 表示空格:必须用
unquote_plus - 正确链式写法:
parse_qs(unquote_plus(urlparse(url).query))
选 parse_qs 还是 parse_qsl?看你要不要保留空值和多值
两者输入相同,输出语义不同:
-
parse_qs返回{key: [val1, val2]},天然支持重复参数和空值控制(keep_blank_values=True才保留name=这类空键) -
parse_qsl返回[(key, value)]列表,顺序严格,适合转成单值字典:dict(parse_qsl(...)) - 若确定无重复键且不需要区分“未传”和“传了空值”,
parse_qsl更轻量直观
取值别直接写 result['key'][0],加一层防护
因为 parse_qs 的结果是字典套列表,而键可能根本不存在,或列表为空。
- 安全取第一个值:
params.get('key', [''])[0] - 想统一转为单值字典(接受丢弃重复项):
{k: v[0] for k, v in params.items()} - 需要保留所有值又不想写索引,遍历
params['key']即可,它本来就是列表











