在 Python 中,获取 URL 地址中的参数(查询字符串)有几种常见的方法,以下是几种主流的实现方式,从简单到推荐,并附有详细解释和示例。

使用 urllib.parse (标准库,推荐)
这是 Python 标准库中处理 URL 的官方方式,功能全面且稳定,它主要用于解析 URL 的各个部分,parse_qs 和 parse_qsl 是专门用来解析查询字符串的。
使用 parse_qs() - 返回字典列表
parse_qs() 会将查询字符串解析成一个字典,其中每个键的值都是一个列表,因为一个参数名可能出现多次。
示例:
from urllib.parse import parse_qs, urlparse
url = "https://www.example.com/search?q=python&sort=desc&page=1&q=django"
# 1. 首先使用 urlparse() 获取查询字符串部分
parsed_url = urlparse(url)
query_string = parsed_url.query
print(f"查询字符串: {query_string}")
# 输出: 查询字符串: q=python&sort=desc&page=1&q=django
# 2. 使用 parse_qs() 解析查询字符串
params = parse_qs(query_string)
print(f"解析结果: {params}")
# 输出: 解析结果: {'q': ['python', 'django'], 'sort': ['desc'], 'page': ['1']}
# 3. 访问参数值
# 因为值是列表,所以需要通过索引 [0] 来获取第一个值
q_value = params.get('q', [''])[0]
print(f"q 参数的值: {q_value}")
# 输出: q 参数的值: python
page_value = params.get('page', [''])[0]
print(f"page 参数的值: {page_value}")
# 输出: page 参数的值: 1
# 如果参数不存在,get() 会返回默认值
non_existent_param = params.get('category', ['默认值'])[0]
print(f"category 参数的值: {non_existent_param}")
# 输出: category 参数的值: 默认值
使用 parse_qsl() - 返回键值对列表
parse_qsl() 将查询字符串解析成一个由 (key, value) 元组组成的列表,当你需要遍历所有参数(包括重复的参数名)时,这个方法非常有用。

示例:
from urllib.parse import parse_qsl, urlparse
url = "https://www.example.com/search?q=python&sort=desc&page=1&q=django"
parsed_url = urlparse(url)
query_string = parsed_url.query
# 使用 parse_qsl() 解析
params_list = parse_qsl(query_string)
print(f"解析结果 (列表): {params_list}")
# 输出: 解析结果 (列表): [('q', 'python'), ('sort', 'desc'), ('page', '1'), ('q', 'django')]
# 可以轻松地遍历所有参数
for key, value in params_list:
print(f"键: {key}, 值: {value}")
使用 requests 库 (适用于网络请求)
如果你正在使用 requests 库来发起 HTTP 请求,它已经为你解析好了 URL 参数,并直接放在 params 属性中,这在你已经发送了请求后获取参数非常方便。
注意:这个方法获取的是请求中使用的参数,而不是从一个字符串 URL 中解析。
示例:

import requests
# 假设你要发送一个 GET 请求
url = "https://www.example.com/search"
params_to_send = {
'q': 'python tutorial',
'page': '1',
'lang': 'zh'
}
# 发送 GET 请求,requests 会自动将 params 字典编码并附加到 URL
response = requests.get(url, params=params_to_send)
# response.request.url 会显示最终发送出去的完整 URL
final_url = response.request.url
print(f"最终请求的 URL: {final_url}")
# 输出: 最终请求的 URL: https://www.example.com/search?q=python+tutorial&page=1&lang=zh
# 如果你想从这个 URL 字符串中再次解析参数,可以结合方法一
# response.request.params 包含了原始的、未编码的参数字典
print(f"原始请求参数: {response.request.params}")
# 输出: 原始请求参数: {'q': 'python tutorial', 'page': '1', 'lang': 'zh'}
手动分割 (不推荐,仅用于理解原理)
对于非常简单的 URL,你可以使用字符串的 split() 方法来手动分割,这种方法代码冗长、脆弱(容易因 URL 格式变化而出错),不推荐在生产环境中使用。
示例:
url = "https://www.example.com/search?q=python&sort=desc&page=1"
# 1. 分割出查询字符串部分
# 找到 '?' 之后的所有内容
query_part = url.split('?', 1)[1]
print(f"查询字符串部分: {query_part}")
# 输出: 查询字符串部分: q=python&sort=desc&page=1
# 2. 按 '&' 分割成各个参数对
param_pairs = query_part.split('&')
print(f"参数对列表: {param_pairs}")
# 输出: 参数对列表: ['q=python', 'sort=desc', 'page=1']
# 3. 遍历并分割每个键值对
params = {}
for pair in param_pairs:
# 按 '=' 分割键和值
key, value = pair.split('=', 1) # 使用 maxsplit=1 防止值中包含 '='
params[key] = value
print(f"手动解析结果: {params}")
# 输出: 手动解析结果: {'q': 'python', 'sort': 'desc', 'page': '1'}
总结与选择
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
urllib.parse |
标准库,无需安装,功能强大稳定,能正确处理 URL 编码。 | parse_qs 返回列表,需要额外一步 [0] 来取值。 |
绝大多数情况下的首选,无论是从字符串中解析 URL,还是构建 URL,都应该使用它。 |
requests |
与网络请求无缝集成,非常方便。 | 仅在你已经使用 requests 发起请求后才适用,不能用于纯字符串解析。 |
当你使用 requests 库,并且需要获取当前请求所使用的参数时。 |
| 手动分割 | 简单直观,无需引入额外模块。 | 代码冗长、脆弱、无法处理 URL 编码(如 代表空格)、无法处理重复参数名。 | 不推荐,仅用于学习 URL 结构或处理极其简单、可控的字符串。 |
最终建议:
直接使用
urllib.parse中的urlparse和parse_qs。 这是处理 URL 参数最标准、最可靠的方法。
