# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。