您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python urllib.parse 的常用方法有哪些
`urllib.parse` 是 Python 标准库中用于 URL 解析和操作的模块,提供了一系列处理 URL 各组成部分的方法。本文将详细介绍该模块的常用方法及其应用场景。
## 目录
1. [URL 解析基础](#url-解析基础)
2. [urlparse() 方法](#urlparse-方法)
3. [urlunparse() 方法](#urlunparse-方法)
4. [urlsplit() 和 urlunsplit()](#urlsplit-和-urlunsplit)
5. [parse_qs() 和 parse_qsl()](#parse_qs-和-parse_qsl)
6. [quote() 和 unquote()](#quote-和-unquote)
7. [urlencode() 方法](#urlencode-方法)
8. [urljoin() 方法](#urljoin-方法)
9. [实际应用示例](#实际应用示例)
10. [总结](#总结)
---
## URL 解析基础
URL(统一资源定位符)由多个部分组成:
scheme://netloc/path?query#fragment
- **scheme**: 协议(如 http, https)
- **netloc**: 网络位置(域名+端口)
- **path**: 路径
- **query**: 查询参数
- **fragment**: 片段标识符(如锚点)
---
## urlparse() 方法
将 URL 字符串解析为 `ParseResult` 对象,包含 6 个组件:
```python
from urllib.parse import urlparse
url = "https://example.com/path/to/page?name=val&age=25#section"
result = urlparse(url)
print(result)
# 输出: ParseResult(
# scheme='https',
# netloc='example.com',
# path='/path/to/page',
# params='',
# query='name=val&age=25',
# fragment='section'
# )
# 访问各部分
print(result.scheme) # 'https'
print(result.query) # 'name=val&age=25'
allow_fragments
: 是否解析片段(默认为 True)将 ParseResult
或可迭代对象重新组合为 URL 字符串:
from urllib.parse import urlunparse
parts = ('https', 'example.com', '/path', '', 'a=1&b=2', 'footer')
print(urlunparse(parts))
# 输出: 'https://example.com/path?a=1&b=2#footer'
与 urlparse()
类似,但不拆分 params
部分(返回 5 元组):
from urllib.parse import urlsplit, urlunsplit
url = "https://example.com/path;params?query=1#frag"
result = urlsplit(url)
print(result) # SplitResult(scheme='https', netloc='example.com',
# path='/path;params', query='query=1', fragment='frag')
# 重组URL
print(urlunsplit(result)) # 原样输出
解析查询字符串为字典或元组列表:
from urllib.parse import parse_qs, parse_qsl
query = "name=John&age=30&city=NY"
print(parse_qs(query))
# {'name': ['John'], 'age': ['30'], 'city': ['NY']}
print(parse_qsl(query))
# [('name', 'John'), ('age', '30'), ('city', 'NY')]
parse_qs()
: 返回字典,值始终为列表(因参数可重复)parse_qsl()
: 返回元组列表,保留原始顺序处理 URL 编码(百分号编码):
from urllib.parse import quote, unquote
s = "北京 & Shanghai"
encoded = quote(s)
print(encoded) # '%E5%8C%97%E4%BA%AC%20%26%20Shanghai'
decoded = unquote(encoded)
print(decoded) # '北京 & Shanghai'
safe
: 指定不需编码的字符(默认为 /
)encoding
/errors
: 编码处理方式将字典或元组列表转换为 URL 查询字符串:
from urllib.parse import urlencode
params = {'q': 'Python', 'page': 1}
print(urlencode(params)) # 'q=Python&page=1'
# 处理多值
multi_params = [('k', 'v1'), ('k', 'v2')]
print(urlencode(multi_params)) # 'k=v1&k=v2'
doseq
: 是否展开序列值(如列表)safe
: 保留字符encoding
: 编码方式智能拼接基础 URL 和相对路径:
from urllib.parse import urljoin
base = "https://example.com/path/"
print(urljoin(base, "subdir/file.html"))
# 'https://example.com/path/subdir/file.html'
print(urljoin(base, "/absolute/path"))
# 'https://example.com/absolute/path'
/
开头,替换基础路径base_url = "https://api.example.com/search"
params = {
'keyword': 'Python教程',
'limit': 10,
'offset': 0
}
query_string = urlencode(params, encoding='utf-8')
full_url = f"{base_url}?{query_string}"
# 输出: https://api.example.com/search?keyword=Python%E6%95%99%E7%A8%8B&limit=10&offset=0
url = "http://old-domain.com/blog/post?id=123"
parsed = urlparse(url)
new_netloc = "new-domain.com"
updated = parsed._replace(netloc=new_netloc, scheme="https")
print(urlunparse(updated))
# 输出: 'https://new-domain.com/blog/post?id=123'
user_input = "search?q=<script>alert(1)</script>"
safe_input = quote(user_input)
# 输出: 'search%3Fq%3D%3Cscript%3Ealert%281%29%3C%2Fscript%3E'
urllib.parse
模块的主要方法对比:
方法 | 输入 | 输出 | 典型用途 |
---|---|---|---|
urlparse() |
URL 字符串 | ParseResult 对象 | 解析 URL 各组件 |
urlunparse() |
6 元组 | URL 字符串 | 重组 URL |
urlsplit() |
URL 字符串 | SplitResult 对象 | 快速解析(无 params) |
parse_qs() |
查询字符串 | 字典 | 处理 GET 参数 |
urlencode() |
字典/元组列表 | 查询字符串 | 构建请求参数 |
urljoin() |
基础 URL + 相对路径 | 绝对 URL | 解决相对路径问题 |
掌握这些方法可以高效处理: - Web 爬虫中的 URL 构造与解析 - API 请求参数的编码 - 用户输入的安全处理 - 网页链接的规范化
建议结合具体场景选择合适的方法,并注意编码和安全性问题。 “`
该文章共计约2150字,采用Markdown格式编写,包含代码示例、参数说明和实际应用场景,符合技术文档的规范要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。