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è)主要門類: 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 部分的開頭斜杠例外,它如果存在則會(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 因而以路徑的組成部分開頭。

>>>
>>> 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

用戶名

None

password

密碼

None

hostname

主機(jī)名(小寫)

None

port

端口號(hào)為整數(shù)(如果存在)

None

如果在 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 異常。

可選的 encodingerrors 形參指定如何將以百分號(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 版更改: 增加了 encodingerrors 形參。

在 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 異常。

可選的 encodingerrors 形參指定如何將以百分號(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 版更改: 增加了 encodingerrors 形參。

在 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

用戶名

None

password

密碼

None

hostname

主機(jī)名(小寫)

None

port

端口號(hào)為整數(shù)(如果存在)

None

如果在 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ù)處理,移除可能存在的 schemenetloc 部分。

在 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/pathscheme://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ì)象也可以操作 bytesbytearray 對(duì)象。

如果傳入 str 數(shù)據(jù),結(jié)果將只包含 str 數(shù)據(jù)。 如果傳入 bytesbytearray 數(shù)據(jù),則結(jié)果也將只包含 bytes 數(shù)據(jù)。

試圖在單個(gè)函數(shù)調(diào)用中混用 str 數(shù)據(jù)和 bytesbytearray 數(shù)據(jù)將導(dǎo)致引發(fā) TypeError,而試圖傳入非 ASCII 字節(jié)值則將引發(fā) UnicodeDecodeError。

為了支持結(jié)果對(duì)象在 strbytes 之間方便地轉(zhuǎn)換,所有來(lái)自 URL 解析函數(shù)的返回值都會(huì)提供 encode() 方法 (當(dāng)結(jié)果包含 str 數(shù)據(jù)) 或 decode() 方法 (當(dāng)結(jié)果包含 bytes 數(shù)據(jù))。 這些方法的簽名與 strbytes 的對(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ī)化為小寫字母、空的組成部分可能被丟棄。 特別地,空的參數(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)在 bytesbytearray 對(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 可以是 strbytes 對(duì)象。

在 3.7 版更改: RFC 2396 遷移到 RFC 3986 以轉(zhuǎn)碼 URL 字符串。 "~" 現(xiàn)在已被包括在非保留字符集中。

可選的 encodingerrors 形參指明如何處理非 ASCII 字符,與 str.encode() 方法所接受的值一樣。 encoding 默認(rèn)為 'utf-8'。 errors 默認(rèn)為 'strict',表示不受支持的字符將引發(fā) UnicodeEncodeError。 如果 stringbytes 則不可提供 encodingerrors,否則將引發(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à)物。 可選的 encodingerrors 形參指定如何將以百分號(hào)編碼的序列解碼為 Unicode 字符,即 bytes.decode() 方法所接受的數(shù)據(jù)。

string 可以是 strbytes 對(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 可以是 strbytes 對(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è)包含有 strbytes 對(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)行分隔,其中 keyvalue 都已使用 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, encodingerrors 形參會(huì)被傳遞給 quote_via (encodingerrors 形參僅在查詢?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ǔ)義和句法。