urllib.parse
用于解析 URL?
源代碼: Lib/urllib/parse.py
該模塊定義了一個(gè)標(biāo)準(zhǔn)接口,用于將統(tǒng)一資源定位符(URL)字符串拆分為不同部分(協(xié)議、網(wǎng)絡(luò)位置、路徑等),或?qū)⒏鱾€(gè)部分組合回 URL 字符串,并將“相對(duì) URL”轉(zhuǎn)換為基于給定的“基準(zhǔn) URL”的絕對(duì) URL。
該模塊被設(shè)計(jì)為匹配針對(duì)相對(duì)統(tǒng)一資源定位符的因特網(wǎng) RFC。 它支持下列 URL 類型: file
, ftp
, gopher
, hdl
, http
, https
, imap
, mailto
, mms
, news
, nntp
, prospero
, rsync
, rtsp
, rtspu
, sftp
, shttp
, sip
, sips
, snews
, svn
, svn+ssh
, telnet
, wais
, ws
, wss
.
urllib.parse
模塊定義的函數(shù)可分為兩個(gè)主要門(mén)類: URL 解析和 URL 轉(zhuǎn)碼。 這些函數(shù)將在以下各節(jié)中詳細(xì)說(shuō)明。
URL 解析?
URL 解析函數(shù)用于將一個(gè) URL 字符串分割成其組成部分,或者將 URL 的多個(gè)部分組合成一個(gè) URL 字符串。
- urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)?
將一個(gè) URL 解析為六個(gè)部分,返回一個(gè)包含 6 項(xiàng)的 named tuple。 這對(duì)應(yīng)于 URL 的主要結(jié)構(gòu):
scheme://netloc/path;parameters?query#fragment
。 每個(gè)元組項(xiàng)均為字符串,可能為空字符串。 這些部分不會(huì)再被拆分為更小的部分(例如,netloc 將為單個(gè)字符串),并且 % 轉(zhuǎn)義不會(huì)被擴(kuò)展。 上面顯示的分隔符不會(huì)出現(xiàn)在結(jié)果中,只有 path 部分的開(kāi)頭斜杠例外,它如果存在則會(huì)被保留。 例如:>>> from urllib.parse import urlparse >>> urlparse("scheme://netloc/path;parameters?query#fragment") ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='', query='query', fragment='fragment') >>> o = urlparse("http://docs.python.org:80/3/library/urllib.parse.html?" ... "highlight=params#url-parsing") >>> o ParseResult(scheme='http', netloc='docs.python.org:80', path='/3/library/urllib.parse.html', params='', query='highlight=params', fragment='url-parsing') >>> o.scheme 'http' >>> o.netloc 'docs.python.org:80' >>> o.hostname 'docs.python.org' >>> o.port 80 >>> o._replace(fragment="").geturl() 'http://docs.python.org:80/3/library/urllib.parse.html?highlight=params'
根據(jù) RFC 1808 中的語(yǔ)法規(guī)范,urlparse 僅在 netloc 前面正確地附帶了 '//' 的情況下才會(huì)識(shí)別它。 否則輸入會(huì)被當(dāng)作是一個(gè)相對(duì) URL 因而以路徑的組成部分開(kāi)頭。
>>> from urllib.parse import urlparse >>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html') ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', query='', fragment='')
scheme 參數(shù)給出了默認(rèn)的協(xié)議,只有在 URL 未指定協(xié)議的情況下才會(huì)被使用。 它應(yīng)該是與 urlstring 相同的類型(文本或字節(jié)串),除此之外默認(rèn)值
''
也總是被允許,并會(huì)在適當(dāng)情況下自動(dòng)轉(zhuǎn)換為b''
。如果 allow_fragments 參數(shù)為假值,則片段標(biāo)識(shí)符不會(huì)被識(shí)別。 它們會(huì)被解析為路徑、參數(shù)或查詢部分,在返回值中
fragment
會(huì)被設(shè)為空字符串。返回值是一個(gè) named tuple,這意味著它的條目可以通過(guò)索引或作為命名屬性來(lái)訪問(wèn),這些屬性是:
屬性
索引
值
值(如果不存在)
scheme
0
URL 協(xié)議說(shuō)明符
scheme 參數(shù)
netloc
1
網(wǎng)絡(luò)位置部分
空字符串
path
2
分層路徑
空字符串
params
3
No longer used
always an empty string
query
4
查詢組件
空字符串
fragment
5
片段標(biāo)識(shí)符
空字符串
username
用戶名
password
密碼
hostname
主機(jī)名(小寫(xiě))
port
端口號(hào)為整數(shù)(如果存在)
如果在 URL 中指定了無(wú)效的端口,讀取
port
屬性將引發(fā)ValueError
。 有關(guān)結(jié)果對(duì)象的更多信息請(qǐng)參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)。在
netloc
屬性中不匹配的方括號(hào)將引發(fā)ValueError
。如果
netloc
屬性中的字符在 NFKC 規(guī)范化下(如 IDNA 編碼格式所使用的)被分解成/
,?
,#
,@
或:
則將引發(fā)ValueError
。 如果在解析之前 URL 就被分解,則不會(huì)引發(fā)錯(cuò)誤。與所有具名元組的情況一樣,該子類還有一些特別有用的附加方法和屬性。 其中一個(gè)方法是
_replace()
。_replace()
方法將返回一個(gè)新的 ParseResult 對(duì)象來(lái)將指定字段替換為新的值。>>> from urllib.parse import urlparse >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') >>> u ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> u._replace(scheme='http') ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
在 3.2 版更改: 添加了IPv6 URL解析功能。
在 3.3 版更改: 會(huì)對(duì)所有 URL 協(xié)議解析片段(除非 allow_fragment 為假值),依據(jù) RFC 3986 的規(guī)范。 在之前版本中,存在一個(gè)支持片段的協(xié)議允許名單。
在 3.6 版更改: 超范圍的端口號(hào)現(xiàn)在會(huì)引發(fā)
ValueError
,而不是返回None
。在 3.8 版更改: 在 NFKC 規(guī)范化下會(huì)影響 netloc 解析的字符現(xiàn)在將引發(fā)
ValueError
。
- urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')?
解析以字符串參數(shù)形式(類型為 application/x-www-form-urlencoded 的數(shù)據(jù))給出的查詢字符串。 返回字典形式的數(shù)據(jù)。 結(jié)果字典的鍵為唯一的查詢變量名而值為每個(gè)變量名對(duì)應(yīng)的值列表。
可選參數(shù) keep_blank_values 是一個(gè)旗標(biāo),指明是否要將以百分號(hào)轉(zhuǎn)碼的空值作為空字符串處理。 真值表示空值應(yīng)當(dāng)被保留作為空字符串。 默認(rèn)的假值表示空值會(huì)被忽略并將其視作未包括的值。
可選參數(shù) strict_parsing 是一個(gè)旗標(biāo),指明要如何處理解析錯(cuò)誤。 如為假值(默認(rèn)),錯(cuò)誤會(huì)被靜默地忽略。 如為真值,錯(cuò)誤會(huì)引發(fā)
ValueError
異常。可選的 encoding 和 errors 形參指定如何將以百分號(hào)編碼的序列解碼為 Unicode 字符,即作為
bytes.decode()
方法所接受的數(shù)據(jù)。可選參數(shù) max_num_fields 是要讀取的最大字段數(shù)量的。 如果設(shè)置,則如果讀取的字段超過(guò) max_num_fields 會(huì)引發(fā)
ValueError
。可選參數(shù) separator 是用來(lái)分隔查詢參數(shù)的符號(hào)。 默認(rèn)為
&
。使用
urllib.parse.urlencode()
函數(shù) (并將doseq
形參設(shè)為True
) 將這樣的字典轉(zhuǎn)換為查詢字符串。在 3.2 版更改: 增加了 encoding 和 errors 形參。
在 3.8 版更改: 增加了 max_num_fields 形參。
在 3.10 版更改: 增加了 separator 形參,默認(rèn)值為
&
。 Python 在早于 Python 3.10 的版本中允許使用;
和&
作為查詢參數(shù)分隔符。 此設(shè)置已被改為只允許單個(gè)分隔符鍵,并以&
作為默認(rèn)的分隔符。
- urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')?
解析以字符串參數(shù)形式(類型為 application/x-www-form-urlencoded 的數(shù)據(jù))給出的查詢字符串。 數(shù)據(jù)以字段名和字段值對(duì)列表的形式返回。
可選參數(shù) keep_blank_values 是一個(gè)旗標(biāo),指明是否要將以百分號(hào)轉(zhuǎn)碼的空值作為空字符串處理。 真值表示空值應(yīng)當(dāng)被保留作為空字符串。 默認(rèn)的假值表示空值會(huì)被忽略并將其視作未包括的值。
可選參數(shù) strict_parsing 是一個(gè)旗標(biāo),指明要如何處理解析錯(cuò)誤。 如為假值(默認(rèn)),錯(cuò)誤會(huì)被靜默地忽略。 如為真值,錯(cuò)誤會(huì)引發(fā)
ValueError
異常。可選的 encoding 和 errors 形參指定如何將以百分號(hào)編碼的序列解碼為 Unicode 字符,即作為
bytes.decode()
方法所接受的數(shù)據(jù)。可選參數(shù) max_num_fields 是要讀取的最大字段數(shù)量的。 如果設(shè)置,則如果讀取的字段超過(guò) max_num_fields 會(huì)引發(fā)
ValueError
。可選參數(shù) separator 是用來(lái)分隔查詢參數(shù)的符號(hào)。 默認(rèn)為
&
。使用
urllib.parse.urlencode()
函數(shù)將這樣的名值對(duì)列表轉(zhuǎn)換為查詢字符串。在 3.2 版更改: 增加了 encoding 和 errors 形參。
在 3.8 版更改: 增加了 max_num_fields 形參。
在 3.10 版更改: 增加了 separator 形參,默認(rèn)值為
&
。 Python 在早于 Python 3.10 的版本中允許使用;
和&
作為查詢參數(shù)分隔符。 此設(shè)置已被改為只允許單個(gè)分隔符鍵,并以&
作為默認(rèn)的分隔符。
- urllib.parse.urlunparse(parts)?
根據(jù)
urlparse()
所返回的元組來(lái)構(gòu)造一個(gè) URL。 parts 參數(shù)可以是任何包含六個(gè)條目的可迭代對(duì)象。 構(gòu)造的結(jié)果可能是略有不同但保持等價(jià)的 URL,如果被解析的 URL 原本包含不必要的分隔符(例如,帶有空查詢的?
;RFC 已聲明這是等價(jià)的)。
- urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)?
此函數(shù)類似于
urlparse()
,但不會(huì)拆分來(lái)自 URL 的參數(shù)。 此函數(shù)通常應(yīng)當(dāng)在需要允許將參數(shù)應(yīng)用到 URL 的 path 部分的每個(gè)分節(jié)的較新的 URL 語(yǔ)法的情況下 (參見(jiàn) RFC 2396) 被用來(lái)代替urlparse()
。 需要使用一個(gè)拆分函數(shù)來(lái)拆分路徑分節(jié)和參數(shù)。 此函數(shù)將返回包含 5 個(gè)條目的 named tuple:(addressing scheme, network location, path, query, fragment identifier).
返回值是一個(gè) named tuple,它的條目可以通過(guò)索引或作為命名屬性來(lái)訪問(wèn):
屬性
索引
值
值(如果不存在)
scheme
0
URL 協(xié)議說(shuō)明符
scheme 參數(shù)
netloc
1
網(wǎng)絡(luò)位置部分
空字符串
path
2
分層路徑
空字符串
query
3
查詢組件
空字符串
fragment
4
片段標(biāo)識(shí)符
空字符串
username
用戶名
password
密碼
hostname
主機(jī)名(小寫(xiě))
port
端口號(hào)為整數(shù)(如果存在)
如果在 URL 中指定了無(wú)效的端口,讀取
port
屬性將引發(fā)ValueError
。 有關(guān)結(jié)果對(duì)象的更多信息請(qǐng)參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)。在
netloc
屬性中不匹配的方括號(hào)將引發(fā)ValueError
。如果
netloc
屬性中的字符在 NFKC 規(guī)范化下(如 IDNA 編碼格式所使用的)被分解成/
,?
,#
,@
或:
則將引發(fā)ValueError
。 如果在解析之前 URL 就被分解,則不會(huì)引發(fā)錯(cuò)誤。依據(jù)更新 RFC 3986 的 WHATWG spec,ASCII 換行符
\n
,\r
和制表符\t
等字符會(huì)從 URL 中被去除。在 3.6 版更改: 超范圍的端口號(hào)現(xiàn)在會(huì)引發(fā)
ValueError
,而不是返回None
。在 3.8 版更改: 在 NFKC 規(guī)范化下會(huì)影響 netloc 解析的字符現(xiàn)在將引發(fā)
ValueError
。在 3.10 版更改: ASCII 換行符和制表符會(huì)從 URL 中被去除。
- urllib.parse.urlunsplit(parts)?
將
urlsplit()
所返回的元組中的元素合并為一個(gè)字符串形式的完整 URL。 parts 參數(shù)可以是任何包含五個(gè)條目的可迭代對(duì)象。 其結(jié)果可能是略有不同但保持等價(jià)的 URL,如果被解析的 URL 原本包含不必要的分隔符(例如,帶有空查詢的 ?;RFC 已聲明這是等價(jià)的)。
- urllib.parse.urljoin(base, url, allow_fragments=True)?
通過(guò)合并一個(gè) "基準(zhǔn) URL" (base) 和另一個(gè) URL (url) 來(lái)構(gòu)造一個(gè)完整 ("absolute") URL。 在非正式情況下,這將使用基準(zhǔn) URL 的各部分,特別是地址協(xié)議、網(wǎng)絡(luò)位置和 (一部分) 路徑來(lái)提供相對(duì) URL 中缺失的部分。 例如:
>>> from urllib.parse import urljoin >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html') 'http://www.cwi.nl/%7Eguido/FAQ.html'
allow_fragments 參數(shù)具有與
urlparse()
中的對(duì)應(yīng)參數(shù)一致的含義與默認(rèn)值。備注
如果 url 為絕對(duì) URL (即以
//
或scheme://
打頭),則 url 的主機(jī)名和/或協(xié)議將出現(xiàn)在結(jié)果中。 例如:>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', ... '//www.python.org/%7Eguido') 'http://www.python.org/%7Eguido'
如果你不想要那樣的行為,請(qǐng)使用
urlsplit()
和urlunsplit()
對(duì) url 進(jìn)行預(yù)處理,移除可能存在的 scheme 和 netloc 部分。在 3.5 版更改: 更新行為以匹配 RFC 3986 中定義的語(yǔ)義。
- urllib.parse.urldefrag(url)?
如果 url 包含片段標(biāo)識(shí)符,則返回不帶片段標(biāo)識(shí)符的 url 修改版本。 如果 url 中沒(méi)有片段標(biāo)識(shí)符,則返回未經(jīng)修改的 url 和一個(gè)空字符串。
返回值是一個(gè) named tuple,它的條目可以通過(guò)索引或作為命名屬性來(lái)訪問(wèn):
屬性
索引
值
值(如果不存在)
url
0
不帶片段的 URL
空字符串
fragment
1
片段標(biāo)識(shí)符
空字符串
請(qǐng)參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)了解有關(guān)結(jié)果對(duì)象的更多信息。
在 3.2 版更改: 結(jié)果為已構(gòu)造好的對(duì)象而不是一個(gè)簡(jiǎn)單的 2 元組。-tuple.
- urllib.parse.unwrap(url)?
從已包裝的 URL (即被格式化為
<URL:scheme://host/path>
,<scheme://host/path>
,URL:scheme://host/path
或scheme://host/path
的字符串) 中提取 URL。 如果 url 不是一個(gè)已包裝的 URL,它將被原樣返回。
解析ASCII編碼字節(jié)?
這些 URL 解析函數(shù)最初設(shè)計(jì)只用于操作字符串。 但在實(shí)踐中,它也能夠操作經(jīng)過(guò)正確轉(zhuǎn)碼和編碼的 ASCII 字節(jié)序列形式的 URL。 相應(yīng)地,此模塊中的 URL 解析函數(shù)既可以操作 str
對(duì)象也可以操作 bytes
和 bytearray
對(duì)象。
如果傳入 str
數(shù)據(jù),結(jié)果將只包含 str
數(shù)據(jù)。 如果傳入 bytes
或 bytearray
數(shù)據(jù),則結(jié)果也將只包含 bytes
數(shù)據(jù)。
試圖在單個(gè)函數(shù)調(diào)用中混用 str
數(shù)據(jù)和 bytes
或 bytearray
數(shù)據(jù)將導(dǎo)致引發(fā) TypeError
,而試圖傳入非 ASCII 字節(jié)值則將引發(fā) UnicodeDecodeError
。
為了支持結(jié)果對(duì)象在 str
和 bytes
之間方便地轉(zhuǎn)換,所有來(lái)自 URL 解析函數(shù)的返回值都會(huì)提供 encode()
方法 (當(dāng)結(jié)果包含 str
數(shù)據(jù)) 或 decode()
方法 (當(dāng)結(jié)果包含 bytes
數(shù)據(jù))。 這些方法的簽名與 str
和 bytes
的對(duì)應(yīng)方法相匹配 (不同之處在于其默認(rèn)編碼格式是 'ascii'
而非 'utf-8'
)。 每個(gè)方法會(huì)輸出包含相應(yīng)類型的 bytes
數(shù)據(jù) (對(duì)于 encode()
方法) 或 str
數(shù)據(jù) (對(duì)于 decode()
方法) 的值。
對(duì)于某些需要在有可能不正確地轉(zhuǎn)碼的包含非 ASCII 數(shù)據(jù)的 URL 上進(jìn)行操作的應(yīng)用程序來(lái)說(shuō),在發(fā)起調(diào)用 URL 解析方法之前必須自行將字節(jié)串解碼為字符。
在本節(jié)中描述的行為僅適用于 URL 解析函數(shù)。 URL 轉(zhuǎn)碼函數(shù)在產(chǎn)生和消耗字節(jié)序列時(shí)使用它們自己的規(guī)則,詳情參見(jiàn)單獨(dú) URL 轉(zhuǎn)碼函數(shù)的文檔。
在 3.2 版更改: URL 解析函數(shù)現(xiàn)在接受 ASCII 編碼的字節(jié)序列
結(jié)構(gòu)化解析結(jié)果?
urlparse()
, urlsplit()
和 urldefrag()
函數(shù)的結(jié)果對(duì)象是 tuple
類型的子類。 這些子類中增加了在那些函數(shù)的文檔中列出的屬性,之前小節(jié)中描述的編碼和解碼支持,以及一個(gè)附加方法:
- urllib.parse.SplitResult.geturl()?
以字符串形式返回原始 URL 的重合并版本。 這可能與原始 URL 有所不同,例如協(xié)議的名稱可能被正規(guī)化為小寫(xiě)字母、空的組成部分可能被丟棄。 特別地,空的參數(shù)、查詢和片段標(biāo)識(shí)符將會(huì)被移除。
對(duì)于
urldefrag()
的結(jié)果,只有空的片段標(biāo)識(shí)符會(huì)被移除。 對(duì)于urlsplit()
和urlparse()
的結(jié)果,所有被記錄的改變都會(huì)被應(yīng)用到此方法所返回的 URL 上。如果是通過(guò)原始的解析方法傳回則此方法的結(jié)果會(huì)保持不變:
>>> from urllib.parse import urlsplit >>> url = 'HTTP://www.Python.org/doc/#' >>> r1 = urlsplit(url) >>> r1.geturl() 'http://www.Python.org/doc/' >>> r2 = urlsplit(r1.geturl()) >>> r2.geturl() 'http://www.Python.org/doc/'
下面的類提供了當(dāng)在 str
對(duì)象上操作時(shí)對(duì)結(jié)構(gòu)化解析結(jié)果的實(shí)現(xiàn):
- class urllib.parse.DefragResult(url, fragment)?
用于
urldefrag()
結(jié)果的實(shí)體類,包含有str
數(shù)據(jù)。encode()
方法會(huì)返回一個(gè)DefragResultBytes
實(shí)例。3.2 新版功能.
- class urllib.parse.ParseResult(scheme, netloc, path, params, query, fragment)?
用于
urlparse()
結(jié)果的實(shí)體類,包含有str
數(shù)據(jù)。encode()
方法會(huì)返回一個(gè)ParseResultBytes
實(shí)例。
- class urllib.parse.SplitResult(scheme, netloc, path, query, fragment)?
用于
urlsplit()
結(jié)果的實(shí)體類,包含有str
數(shù)據(jù)。encode()
方法會(huì)返回一個(gè)SplitResultBytes
實(shí)例。
下面的類提供了當(dāng)在 bytes
或 bytearray
對(duì)象上操作時(shí)對(duì)解析結(jié)果的實(shí)現(xiàn):
- class urllib.parse.DefragResultBytes(url, fragment)?
用于
urldefrag()
結(jié)果的實(shí)體類,包含有bytes
數(shù)據(jù)。decode()
方法會(huì)返回一個(gè)DefragResult
實(shí)例。3.2 新版功能.
- class urllib.parse.ParseResultBytes(scheme, netloc, path, params, query, fragment)?
用于
urlparse()
結(jié)果的實(shí)體類,包含有bytes
數(shù)據(jù)。decode()
方法會(huì)返回一個(gè)ParseResult
實(shí)例。3.2 新版功能.
- class urllib.parse.SplitResultBytes(scheme, netloc, path, query, fragment)?
用于
urlsplit()
結(jié)果的實(shí)體類,包含有bytes
數(shù)據(jù)。decode()
方法會(huì)返回一個(gè)SplitResult
實(shí)例。3.2 新版功能.
URL 轉(zhuǎn)碼?
URL 轉(zhuǎn)碼函數(shù)的功能是接收程序數(shù)據(jù)并通過(guò)對(duì)特殊字符進(jìn)行轉(zhuǎn)碼并正確編碼非 ASCII 文本來(lái)將其轉(zhuǎn)為可以安全地用作 URL 組成部分的形式。 它們還支持逆轉(zhuǎn)此操作以便從作為 URL 組成部分的內(nèi)容中重建原始數(shù)據(jù),如果上述的 URL 解析函數(shù)還未覆蓋此功能的話。
- urllib.parse.quote(string, safe='/', encoding=None, errors=None)?
使用
%xx
轉(zhuǎn)義符替換 string 中的特殊字符。 字母、數(shù)字和'_.-~'
等字符一定不會(huì)被轉(zhuǎn)碼。 在默認(rèn)情況下,此函數(shù)只對(duì) URL 的路徑部分進(jìn)行轉(zhuǎn)碼。 可選的 safe 形參額外指定不應(yīng)被轉(zhuǎn)碼的 ASCII 字符 --- 其默認(rèn)值為'/'
。string 可以是
str
或bytes
對(duì)象。可選的 encoding 和 errors 形參指明如何處理非 ASCII 字符,與
str.encode()
方法所接受的值一樣。 encoding 默認(rèn)為'utf-8'
。 errors 默認(rèn)為'strict'
,表示不受支持的字符將引發(fā)UnicodeEncodeError
。 如果 string 為bytes
則不可提供 encoding 和 errors,否則將引發(fā)TypeError
。請(qǐng)注意
quote(string, safe, encoding, errors)
等價(jià)于quote_from_bytes(string.encode(encoding, errors), safe)
。例如:
quote('/El Ni?o/')
將產(chǎn)生'/El%20Ni%C3%B1o/'
。
- urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)?
類似于
quote()
,但還會(huì)使用加號(hào)來(lái)替換空格,如在構(gòu)建放入 URL 的查詢字符串時(shí)對(duì)于轉(zhuǎn)碼 HTML 表單值時(shí)所要求的那樣。 原始字符串中的加號(hào)會(huì)被轉(zhuǎn)義,除非它們已包括在 safe 中。 它也不會(huì)將 safe 的默認(rèn)值設(shè)為'/'
。例如:
quote_plus('/El Ni?o/')
將產(chǎn)生'%2FEl+Ni%C3%B1o%2F'
。
- urllib.parse.quote_from_bytes(bytes, safe='/')?
類似于
quote()
,但是接受bytes
對(duì)象而非str
,并且不執(zhí)行從字符串到字節(jié)串的編碼。例如:
quote_from_bytes(b'a&\xef')
將產(chǎn)生'a%26%EF'
。
- urllib.parse.unquote(string, encoding='utf-8', errors='replace')?
將
%xx
轉(zhuǎn)義符替換為其單字符等價(jià)物。 可選的 encoding 和 errors 形參指定如何將以百分號(hào)編碼的序列解碼為 Unicode 字符,即bytes.decode()
方法所接受的數(shù)據(jù)。string 可以是
str
或bytes
對(duì)象。encoding 默認(rèn)為
'utf-8'
。 errors 默認(rèn)為'replace'
,表示無(wú)效的序列將被替換為占位字符。例如:
unquote('/El%20Ni%C3%B1o/')
將產(chǎn)生'/El Ni?o/'
。在 3.9 版更改: string 形參支持 bytes 和 str 對(duì)象(之前僅支持 str)。
- urllib.parse.unquote_plus(string, encoding='utf-8', errors='replace')?
類似于
unquote()
,但還會(huì)將加號(hào)替換為空格,如反轉(zhuǎn)碼表單值所要求的。string 必須為
str
。例如:
unquote_plus('/El+Ni%C3%B1o/')
將產(chǎn)生'/El Ni?o/'
。
- urllib.parse.unquote_to_bytes(string)?
將
%xx
轉(zhuǎn)義符替換為其單八位等價(jià)物,并返回一個(gè)bytes
對(duì)象。string 可以是
str
或bytes
對(duì)象。如果它是
str
,則 string 中未轉(zhuǎn)義的非 ASCII 字符會(huì)被編碼為 UTF-8 字節(jié)串。例如:
unquote_to_bytes('a%26%EF')
y將產(chǎn)生b'a&\xef'
。
- urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)?
將一個(gè)包含有
str
或bytes
對(duì)象的映射對(duì)象或二元組序列轉(zhuǎn)換為以百分號(hào)編碼的 ASCII 文本字符串。 如果所產(chǎn)生的字符串要被用作urlopen()
函數(shù)的 POST 操作的 data,則它應(yīng)當(dāng)被編碼為字節(jié)串,否則它將導(dǎo)致TypeError
。結(jié)果字符串是一系列
key=value
對(duì),由'&'
字符進(jìn)行分隔,其中 key 和 value 都已使用 quote_via 函數(shù)轉(zhuǎn)碼。 在默認(rèn)情況下,會(huì)使用quote_plus()
來(lái)轉(zhuǎn)碼值,這意味著空格會(huì)被轉(zhuǎn)碼為'+'
字符而 '/' 字符會(huì)被轉(zhuǎn)碼為%2F
,即遵循 GET 請(qǐng)求的標(biāo)準(zhǔn) (application/x-www-form-urlencoded
)。 另一個(gè)可以作為 quote_via 傳入的替代函數(shù)是quote()
,它將把空格轉(zhuǎn)碼為%20
并且不編碼 '/' 字符。 為了最大程序地控制要轉(zhuǎn)碼的內(nèi)容,請(qǐng)使用quote
并指定 safe 的值。當(dāng)使用二元組序列作為 query 參數(shù)時(shí),每個(gè)元組的第一個(gè)元素為鍵而第二個(gè)元素為值。 值元素本身也可以為一個(gè)序列,在那種情況下,如果可選的形參 doseq 的值為
True
,則每個(gè)鍵的值序列元素生成單個(gè)key=value
對(duì)(以'&'
分隔)。 被編碼的字符串中的參數(shù)順序?qū)⑴c序列中的形參元素順序相匹配。safe, encoding 和 errors 形參會(huì)被傳遞給 quote_via (encoding 和 errors 形參僅在查詢?cè)貫?
str
時(shí)會(huì)被傳遞)。為了反向執(zhí)行這個(gè)編碼過(guò)程,此模塊提供了
parse_qs()
和parse_qsl()
來(lái)將查詢字符串解析為 Python 數(shù)據(jù)結(jié)構(gòu)。請(qǐng)參考 urllib 示例 來(lái)了解如何使用
urllib.parse.urlencode()
方法來(lái)生成 URL 的查詢字符串或 POST 請(qǐng)求的數(shù)據(jù)。在 3.2 版更改: 查詢支持字節(jié)和字符串對(duì)象。
3.5 新版功能: quote_via 參數(shù).
參見(jiàn)
- WHATWG - URL 現(xiàn)有標(biāo)準(zhǔn)
定義 URL、域名、IP 地址、application/x-www-form-urlencoded 格式及其 API 的工作組。
- RFC 3986 - 統(tǒng)一資源標(biāo)識(shí)符
這是當(dāng)前的標(biāo)準(zhǔn) (STD66)。 任何對(duì)于 urllib.parse 模塊的修改都必須遵循該標(biāo)準(zhǔn)。 某些偏離也可能會(huì)出現(xiàn),這大都是出于向下兼容的目的以及特定的經(jīng)常存在于各主要瀏覽器上的實(shí)際解析需求。
- RFC 2732 - URL 中的 IPv6 Addresses 地址顯示格式。
這指明了 IPv6 URL 的解析要求。
- RFC 2396 - 統(tǒng)一資源標(biāo)識(shí)符(URI):通用語(yǔ)法
描述統(tǒng)一資源名稱 (URN) 和統(tǒng)一資源定位符 (URL) 通用語(yǔ)義要求的文檔。
- RFC 2368 - mailto URL 模式。
mailto URL 模式的解析要求。
- RFC 1808 - 相對(duì)統(tǒng)一資源定位符
這個(gè)請(qǐng)求注釋包括聯(lián)結(jié)絕對(duì)和相對(duì) URL 的規(guī)則,其中包括大量控制邊界情況處理的 "異常示例"。
- RFC 1738 - 統(tǒng)一資源定位符 (URL)
這指明了絕對(duì) URL 的正式語(yǔ)義和句法。