在 Python 中处理 Query String(查询字符串)通常涉及从 URL 中提取参数,或者将字典转换为查询字符串,以下是几种常见的方法:
从 URL 中提取查询参数
使用 urllib.parse(推荐)
from urllib.parse import urlparse, parse_qs, parse_qsl
url = "https://example.com/search?name=John&age=30&city=Beijing&city=Shanghai"
# 解析 URL
parsed_url = urlparse(url)
query_string = parsed_url.query
# 方法 1: parse_qs - 返回字典,值为列表(因为一个键可能有多个值)
params = parse_qs(query_string)
print(params)
# {'name': ['John'], 'age': ['30'], 'city': ['Beijing', 'Shanghai']}
# 方法 2: parse_qsl - 返回键值对列表
params_list = parse_qsl(query_string)
print(params_list)
# [('name', 'John'), ('age', '30'), ('city', 'Beijing'), ('city', 'Shanghai')]
# 获取单个值
name = params['name'][0] # 'John'
age = params.get('age', [''])[0] # '30'
使用 requests 库(处理请求参数)
import requests
# 发送请求时自动处理查询字符串
response = requests.get("https://api.example.com/users", params={"name": "John", "age": 30})
print(response.url)
# https://api.example.com/users?name=John&age=30
将字典转换为查询字符串
使用 urllib.parse.urlencode
from urllib.parse import urlencode
params = {
"name": "John",
"age": 30,
"city": "Beijing"
}
query_string = urlencode(params)
print(query_string)
# name=John&age=30&city=Beijing
# 如果需要包含在 URL 中
from urllib.parse import urlunparse, urlparse
base_url = "https://example.com/search"
parsed = urlparse(base_url)
new_url = parsed._replace(query=query_string).geturl()
print(new_url)
# https://example.com/search?name=John&age=30&city=Beijing
使用 requests 库
import requests
params = {"name": "John", "age": 30}
response = requests.get("https://api.example.com/users", params=params)
print(response.url)
# https://api.example.com/users?name=John&age=30
在 Web 框架中使用
Flask
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
# 获取查询参数
name = request.args.get('name')
age = request.args.get('age', type=int) # 自动转换为整数
# 获取所有查询参数
all_params = request.args.to_dict()
return f"Name: {name}, Age: {age}"
Django
from django.http import HttpResponse
def search_view(request):
# 获取查询参数
name = request.GET.get('name')
age = request.GET.get('age', type=int)
# 获取所有查询参数
all_params = request.GET
return HttpResponse(f"Name: {name}, Age: {age}")
常见注意事项
处理特殊字符
from urllib.parse import quote, unquote
# URL 编码
encoded = quote("Hello World")
print(encoded) # Hello%20World
# URL 解码
decoded = unquote("Hello%20World")
print(decoded) # Hello World
处理多个同名参数
from urllib.parse import parse_qs
url = "https://example.com/search?tag=python&tag=javascript&tag=web"
params = parse_qs(url.split('?')[1])
print(params)
# {'tag': ['python', 'javascript', 'web']}
# 获取所有值
tags = params['tag']
print(tags) # ['python', 'javascript', 'web']
# 获取第一个值
first_tag = params['tag'][0]
print(first_tag) # 'python'
| 场景 | 推荐方法 |
|---|---|
| 解析 URL 查询参数 | urllib.parse.parse_qs() |
| 构建查询字符串 | urllib.parse.urlencode() |
| 发送 HTTP 请求 | requests.get(url, params=dict) |
| Web 框架中获取参数 | Flask: request.args, Django: request.GET |
这些方法涵盖了大多数处理 Query String 的场景,根据你的具体需求选择合适的方法即可。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/483673.html
