urllib.parse 用于解析 URL?

源代碼: Lib/urllib/parse.py


該模塊定義了一個標(biāo)準(zhǔn)接口,用于將統(tǒng)一資源定位符(URL)字符串拆分為不同部分(協(xié)議、網(wǎng)絡(luò)位置、路徑等),或?qū)⒏鱾€部分組合回 URL 字符串,并將“相對 URL”轉(zhuǎn)換為基于給定的“基準(zhǔn) URL”的絕對 URL。

該模塊被設(shè)計為匹配針對相對統(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ù)可分為兩個主要門類: URL 解析和 URL 轉(zhuǎn)碼。 這些函數(shù)將在以下各節(jié)中詳細(xì)說明。

URL 解析?

URL 解析函數(shù)用于將一個 URL 字符串分割成其組成部分,或者將 URL 的多個部分組合成一個 URL 字符串。

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)?

將一個 URL 解析為六個部分,返回一個包含 6 項的 named tuple。 這對應(yīng)于 URL 的主要結(jié)構(gòu): scheme://netloc/path;parameters?query#fragment。 每個元組項均為字符串,可能為空字符串。 這些部分不會再被拆分為更小的部分(例如,netloc 將為單個字符串),并且 % 轉(zhuǎn)義不會被擴(kuò)展。 上面顯示的分隔符不會出現(xiàn)在結(jié)果中,只有 path 部分的開頭斜杠例外,它如果存在則會被保留。 例如:

>>>
>>> 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 中的語法規(guī)范,urlparse 僅在 netloc 前面正確地附帶了 '//' 的情況下才會識別它。 否則輸入會被當(dāng)作是一個相對 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é)議的情況下才會被使用。 它應(yīng)該是與 urlstring 相同的類型(文本或字節(jié)串),除此之外默認(rèn)值 '' 也總是被允許,并會在適當(dāng)情況下自動轉(zhuǎn)換為 b''。

如果 allow_fragments 參數(shù)為假值,則片段標(biāo)識符不會被識別。 它們會被解析為路徑、參數(shù)或查詢部分,在返回值中 fragment 會被設(shè)為空字符串。

返回值是一個 named tuple,這意味著它的條目可以通過索引或作為命名屬性來訪問,這些屬性是:

屬性

索引

值(如果不存在)

scheme

0

URL 協(xié)議說明符

scheme 參數(shù)

netloc

1

網(wǎng)絡(luò)位置部分

空字符串

path

2

分層路徑

空字符串

params

3

No longer used

always an empty string

query

4

查詢組件

空字符串

fragment

5

片段標(biāo)識符

空字符串

username

用戶名

None

password

密碼

None

hostname

主機(jī)名(小寫)

None

port

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

None

如果在 URL 中指定了無效的端口,讀取 port 屬性將引發(fā) ValueError。 有關(guān)結(jié)果對象的更多信息請參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)。

netloc 屬性中不匹配的方括號將引發(fā) ValueError

如果 netloc 屬性中的字符在 NFKC 規(guī)范化下(如 IDNA 編碼格式所使用的)被分解成 /, ?, #, @: 則將引發(fā) ValueError。 如果在解析之前 URL 就被分解,則不會引發(fā)錯誤。

與所有具名元組的情況一樣,該子類還有一些特別有用的附加方法和屬性。 其中一個方法是 _replace()_replace() 方法將返回一個新的 ParseResult 對象來將指定字段替換為新的值。

>>>
>>> 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 版更改: 會對所有 URL 協(xié)議解析片段(除非 allow_fragment 為假值),依據(jù) RFC 3986 的規(guī)范。 在之前版本中,存在一個支持片段的協(xié)議允許名單。

在 3.6 版更改: 超范圍的端口號現(xiàn)在會引發(fā) ValueError,而不是返回 None。

在 3.8 版更改: 在 NFKC 規(guī)范化下會影響 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é)果字典的鍵為唯一的查詢變量名而值為每個變量名對應(yīng)的值列表。

可選參數(shù) keep_blank_values 是一個旗標(biāo),指明是否要將以百分號轉(zhuǎn)碼的空值作為空字符串處理。 真值表示空值應(yīng)當(dāng)被保留作為空字符串。 默認(rèn)的假值表示空值會被忽略并將其視作未包括的值。

可選參數(shù) strict_parsing 是一個旗標(biāo),指明要如何處理解析錯誤。 如為假值(默認(rèn)),錯誤會被靜默地忽略。 如為真值,錯誤會引發(fā) ValueError 異常。

可選的 encodingerrors 形參指定如何將以百分號編碼的序列解碼為 Unicode 字符,即作為 bytes.decode() 方法所接受的數(shù)據(jù)。

可選參數(shù) max_num_fields 是要讀取的最大字段數(shù)量的。 如果設(shè)置,則如果讀取的字段超過 max_num_fields 會引發(fā) ValueError。

可選參數(shù) separator 是用來分隔查詢參數(shù)的符號。 默認(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è)置已被改為只允許單個分隔符鍵,并以 & 作為默認(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ù)以字段名和字段值對列表的形式返回。

可選參數(shù) keep_blank_values 是一個旗標(biāo),指明是否要將以百分號轉(zhuǎn)碼的空值作為空字符串處理。 真值表示空值應(yīng)當(dāng)被保留作為空字符串。 默認(rèn)的假值表示空值會被忽略并將其視作未包括的值。

可選參數(shù) strict_parsing 是一個旗標(biāo),指明要如何處理解析錯誤。 如為假值(默認(rèn)),錯誤會被靜默地忽略。 如為真值,錯誤會引發(fā) ValueError 異常。

可選的 encodingerrors 形參指定如何將以百分號編碼的序列解碼為 Unicode 字符,即作為 bytes.decode() 方法所接受的數(shù)據(jù)。

可選參數(shù) max_num_fields 是要讀取的最大字段數(shù)量的。 如果設(shè)置,則如果讀取的字段超過 max_num_fields 會引發(fā) ValueError。

可選參數(shù) separator 是用來分隔查詢參數(shù)的符號。 默認(rèn)為 &。

使用 urllib.parse.urlencode() 函數(shù)將這樣的名值對列表轉(zhuǎn)換為查詢字符串。

在 3.2 版更改: 增加了 encodingerrors 形參。

在 3.8 版更改: 增加了 max_num_fields 形參。

在 3.10 版更改: 增加了 separator 形參,默認(rèn)值為 &。 Python 在早于 Python 3.10 的版本中允許使用 ;& 作為查詢參數(shù)分隔符。 此設(shè)置已被改為只允許單個分隔符鍵,并以 & 作為默認(rèn)的分隔符。

urllib.parse.urlunparse(parts)?

根據(jù) urlparse() 所返回的元組來構(gòu)造一個 URL。 parts 參數(shù)可以是任何包含六個條目的可迭代對象。 構(gòu)造的結(jié)果可能是略有不同但保持等價的 URL,如果被解析的 URL 原本包含不必要的分隔符(例如,帶有空查詢的 ?;RFC 已聲明這是等價的)。

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)?

此函數(shù)類似于 urlparse(),但不會拆分來自 URL 的參數(shù)。 此函數(shù)通常應(yīng)當(dāng)在需要允許將參數(shù)應(yīng)用到 URL 的 path 部分的每個分節(jié)的較新的 URL 語法的情況下 (參見 RFC 2396) 被用來代替 urlparse()。 需要使用一個拆分函數(shù)來拆分路徑分節(jié)和參數(shù)。 此函數(shù)將返回包含 5 個條目的 named tuple:

(addressing scheme, network location, path, query, fragment identifier).

返回值是一個 named tuple,它的條目可以通過索引或作為命名屬性來訪問:

屬性

索引

值(如果不存在)

scheme

0

URL 協(xié)議說明符

scheme 參數(shù)

netloc

1

網(wǎng)絡(luò)位置部分

空字符串

path

2

分層路徑

空字符串

query

3

查詢組件

空字符串

fragment

4

片段標(biāo)識符

空字符串

username

用戶名

None

password

密碼

None

hostname

主機(jī)名(小寫)

None

port

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

None

如果在 URL 中指定了無效的端口,讀取 port 屬性將引發(fā) ValueError。 有關(guān)結(jié)果對象的更多信息請參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)。

netloc 屬性中不匹配的方括號將引發(fā) ValueError。

如果 netloc 屬性中的字符在 NFKC 規(guī)范化下(如 IDNA 編碼格式所使用的)被分解成 /, ?, #, @: 則將引發(fā) ValueError。 如果在解析之前 URL 就被分解,則不會引發(fā)錯誤。

依據(jù)更新 RFC 3986 的 WHATWG spec,ASCII 換行符 \n, \r 和制表符 \t 等字符會從 URL 中被去除。

在 3.6 版更改: 超范圍的端口號現(xiàn)在會引發(fā) ValueError,而不是返回 None。

在 3.8 版更改: 在 NFKC 規(guī)范化下會影響 netloc 解析的字符現(xiàn)在將引發(fā) ValueError

在 3.10 版更改: ASCII 換行符和制表符會從 URL 中被去除。

urllib.parse.urlunsplit(parts)?

urlsplit() 所返回的元組中的元素合并為一個字符串形式的完整 URL。 parts 參數(shù)可以是任何包含五個條目的可迭代對象。 其結(jié)果可能是略有不同但保持等價的 URL,如果被解析的 URL 原本包含不必要的分隔符(例如,帶有空查詢的 ?;RFC 已聲明這是等價的)。

urllib.parse.urljoin(base, url, allow_fragments=True)?

通過合并一個 "基準(zhǔn) URL" (base) 和另一個 URL (url) 來構(gòu)造一個完整 ("absolute") URL。 在非正式情況下,這將使用基準(zhǔn) URL 的各部分,特別是地址協(xié)議、網(wǎng)絡(luò)位置和 (一部分) 路徑來提供相對 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() 中的對應(yīng)參數(shù)一致的含義與默認(rèn)值。

備注

如果 url 為絕對 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'

如果你不想要那樣的行為,請使用 urlsplit()urlunsplit()url 進(jìn)行預(yù)處理,移除可能存在的 schemenetloc 部分。

在 3.5 版更改: 更新行為以匹配 RFC 3986 中定義的語義。

urllib.parse.urldefrag(url)?

如果 url 包含片段標(biāo)識符,則返回不帶片段標(biāo)識符的 url 修改版本。 如果 url 中沒有片段標(biāo)識符,則返回未經(jīng)修改的 url 和一個空字符串。

返回值是一個 named tuple,它的條目可以通過索引或作為命名屬性來訪問:

屬性

索引

值(如果不存在)

url

0

不帶片段的 URL

空字符串

fragment

1

片段標(biāo)識符

空字符串

請參閱 結(jié)構(gòu)化解析結(jié)果 一節(jié)了解有關(guān)結(jié)果對象的更多信息。

在 3.2 版更改: 結(jié)果為已構(gòu)造好的對象而不是一個簡單的 2 元組。-tuple.

urllib.parse.unwrap(url)?

從已包裝的 URL (即被格式化為 <URL:scheme://host/path>, <scheme://host/path>, URL:scheme://host/pathscheme://host/path 的字符串) 中提取 URL。 如果 url 不是一個已包裝的 URL,它將被原樣返回。

解析ASCII編碼字節(jié)?

這些 URL 解析函數(shù)最初設(shè)計只用于操作字符串。 但在實踐中,它也能夠操作經(jīng)過正確轉(zhuǎn)碼和編碼的 ASCII 字節(jié)序列形式的 URL。 相應(yīng)地,此模塊中的 URL 解析函數(shù)既可以操作 str 對象也可以操作 bytesbytearray 對象。

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

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

為了支持結(jié)果對象在 strbytes 之間方便地轉(zhuǎn)換,所有來自 URL 解析函數(shù)的返回值都會提供 encode() 方法 (當(dāng)結(jié)果包含 str 數(shù)據(jù)) 或 decode() 方法 (當(dāng)結(jié)果包含 bytes 數(shù)據(jù))。 這些方法的簽名與 strbytes 的對應(yīng)方法相匹配 (不同之處在于其默認(rèn)編碼格式是 'ascii' 而非 'utf-8')。 每個方法會輸出包含相應(yīng)類型的 bytes 數(shù)據(jù) (對于 encode() 方法) 或 str 數(shù)據(jù) (對于 decode() 方法) 的值。

對于某些需要在有可能不正確地轉(zhuǎn)碼的包含非 ASCII 數(shù)據(jù)的 URL 上進(jìn)行操作的應(yīng)用程序來說,在發(fā)起調(diào)用 URL 解析方法之前必須自行將字節(jié)串解碼為字符。

在本節(jié)中描述的行為僅適用于 URL 解析函數(shù)。 URL 轉(zhuǎn)碼函數(shù)在產(chǎn)生和消耗字節(jié)序列時使用它們自己的規(guī)則,詳情參見單獨(dú) URL 轉(zhuǎn)碼函數(shù)的文檔。

在 3.2 版更改: URL 解析函數(shù)現(xiàn)在接受 ASCII 編碼的字節(jié)序列

結(jié)構(gòu)化解析結(jié)果?

urlparse(), urlsplit()urldefrag() 函數(shù)的結(jié)果對象是 tuple 類型的子類。 這些子類中增加了在那些函數(shù)的文檔中列出的屬性,之前小節(jié)中描述的編碼和解碼支持,以及一個附加方法:

urllib.parse.SplitResult.geturl()?

以字符串形式返回原始 URL 的重合并版本。 這可能與原始 URL 有所不同,例如協(xié)議的名稱可能被正規(guī)化為小寫字母、空的組成部分可能被丟棄。 特別地,空的參數(shù)、查詢和片段標(biāo)識符將會被移除。

對于 urldefrag() 的結(jié)果,只有空的片段標(biāo)識符會被移除。 對于 urlsplit()urlparse() 的結(jié)果,所有被記錄的改變都會被應(yīng)用到此方法所返回的 URL 上。

如果是通過原始的解析方法傳回則此方法的結(jié)果會保持不變:

>>>
>>> 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 對象上操作時對結(jié)構(gòu)化解析結(jié)果的實現(xiàn):

class urllib.parse.DefragResult(url, fragment)?

用于 urldefrag() 結(jié)果的實體類,包含有 str 數(shù)據(jù)。 encode() 方法會返回一個 DefragResultBytes 實例。

3.2 新版功能.

class urllib.parse.ParseResult(scheme, netloc, path, params, query, fragment)?

用于 urlparse() 結(jié)果的實體類,包含有 str 數(shù)據(jù)。 encode() 方法會返回一個 ParseResultBytes 實例。

class urllib.parse.SplitResult(scheme, netloc, path, query, fragment)?

用于 urlsplit() 結(jié)果的實體類,包含有 str 數(shù)據(jù)。 encode() 方法會返回一個 SplitResultBytes 實例。

下面的類提供了當(dāng)在 bytesbytearray 對象上操作時對解析結(jié)果的實現(xiàn):

class urllib.parse.DefragResultBytes(url, fragment)?

用于 urldefrag() 結(jié)果的實體類,包含有 bytes 數(shù)據(jù)。 decode() 方法會返回一個 DefragResult 實例。

3.2 新版功能.

class urllib.parse.ParseResultBytes(scheme, netloc, path, params, query, fragment)?

用于 urlparse() 結(jié)果的實體類,包含有 bytes 數(shù)據(jù)。 decode() 方法會返回一個 ParseResult 實例。

3.2 新版功能.

class urllib.parse.SplitResultBytes(scheme, netloc, path, query, fragment)?

用于 urlsplit() 結(jié)果的實體類,包含有 bytes 數(shù)據(jù)。 decode() 方法會返回一個 SplitResult 實例。

3.2 新版功能.

URL 轉(zhuǎn)碼?

URL 轉(zhuǎn)碼函數(shù)的功能是接收程序數(shù)據(jù)并通過對特殊字符進(jìn)行轉(zhuǎn)碼并正確編碼非 ASCII 文本來將其轉(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ù)字和 '_.-~' 等字符一定不會被轉(zhuǎn)碼。 在默認(rèn)情況下,此函數(shù)只對 URL 的路徑部分進(jìn)行轉(zhuǎn)碼。 可選的 safe 形參額外指定不應(yīng)被轉(zhuǎn)碼的 ASCII 字符 --- 其默認(rèn)值為 '/'

string 可以是 strbytes 對象。

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

請注意 quote(string, safe, encoding, errors) 等價于 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(),但還會使用加號來替換空格,如在構(gòu)建放入 URL 的查詢字符串時對于轉(zhuǎn)碼 HTML 表單值時所要求的那樣。 原始字符串中的加號會被轉(zhuǎn)義,除非它們已包括在 safe 中。 它也不會將 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 對象而非 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)義符替換為其單字符等價物。 可選的 encodingerrors 形參指定如何將以百分號編碼的序列解碼為 Unicode 字符,即 bytes.decode() 方法所接受的數(shù)據(jù)。

string 可以是 strbytes 對象。

encoding 默認(rèn)為 'utf-8'。 errors 默認(rèn)為 'replace',表示無效的序列將被替換為占位字符。

例如: unquote('/El%20Ni%C3%B1o/') 將產(chǎn)生 '/El Ni?o/'。

在 3.9 版更改: string 形參支持 bytes 和 str 對象(之前僅支持 str)。

urllib.parse.unquote_plus(string, encoding='utf-8', errors='replace')?

類似于 unquote(),但還會將加號替換為空格,如反轉(zhuǎn)碼表單值所要求的。

string 必須為 str。

例如: unquote_plus('/El+Ni%C3%B1o/') 將產(chǎn)生 '/El Ni?o/'

urllib.parse.unquote_to_bytes(string)?

%xx 轉(zhuǎn)義符替換為其單八位等價物,并返回一個 bytes 對象。

string 可以是 strbytes 對象。

如果它是 str,則 string 中未轉(zhuǎn)義的非 ASCII 字符會被編碼為 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)?

將一個包含有 strbytes 對象的映射對象或二元組序列轉(zhuǎn)換為以百分號編碼的 ASCII 文本字符串。 如果所產(chǎn)生的字符串要被用作 urlopen() 函數(shù)的 POST 操作的 data,則它應(yīng)當(dāng)被編碼為字節(jié)串,否則它將導(dǎo)致 TypeError

結(jié)果字符串是一系列 key=value 對,由 '&' 字符進(jìn)行分隔,其中 keyvalue 都已使用 quote_via 函數(shù)轉(zhuǎn)碼。 在默認(rèn)情況下,會使用 quote_plus() 來轉(zhuǎn)碼值,這意味著空格會被轉(zhuǎn)碼為 '+' 字符而 '/' 字符會被轉(zhuǎn)碼為 %2F,即遵循 GET 請求的標(biāo)準(zhǔn) (application/x-www-form-urlencoded)。 另一個可以作為 quote_via 傳入的替代函數(shù)是 quote(),它將把空格轉(zhuǎn)碼為 %20 并且不編碼 '/' 字符。 為了最大程序地控制要轉(zhuǎn)碼的內(nèi)容,請使用 quote 并指定 safe 的值。

當(dāng)使用二元組序列作為 query 參數(shù)時,每個元組的第一個元素為鍵而第二個元素為值。 值元素本身也可以為一個序列,在那種情況下,如果可選的形參 doseq 的值為 True,則每個鍵的值序列元素生成單個 key=value 對(以 '&' 分隔)。 被編碼的字符串中的參數(shù)順序?qū)⑴c序列中的形參元素順序相匹配。

safe, encodingerrors 形參會被傳遞給 quote_via (encodingerrors 形參僅在查詢元素為 str 時會被傳遞)。

為了反向執(zhí)行這個編碼過程,此模塊提供了 parse_qs()parse_qsl() 來將查詢字符串解析為 Python 數(shù)據(jù)結(jié)構(gòu)。

請參考 urllib 示例 來了解如何使用 urllib.parse.urlencode() 方法來生成 URL 的查詢字符串或 POST 請求的數(shù)據(jù)。

在 3.2 版更改: 查詢支持字節(jié)和字符串對象。

3.5 新版功能: quote_via 參數(shù).

參見

WHATWG - URL 現(xiàn)有標(biāo)準(zhǔn)

定義 URL、域名、IP 地址、application/x-www-form-urlencoded 格式及其 API 的工作組。

RFC 3986 - 統(tǒng)一資源標(biāo)識符

這是當(dāng)前的標(biāo)準(zhǔn) (STD66)。 任何對于 urllib.parse 模塊的修改都必須遵循該標(biāo)準(zhǔn)。 某些偏離也可能會出現(xiàn),這大都是出于向下兼容的目的以及特定的經(jīng)常存在于各主要瀏覽器上的實際解析需求。

RFC 2732 - URL 中的 IPv6 Addresses 地址顯示格式。

這指明了 IPv6 URL 的解析要求。

RFC 2396 - 統(tǒng)一資源標(biāo)識符(URI):通用語法

描述統(tǒng)一資源名稱 (URN) 和統(tǒng)一資源定位符 (URL) 通用語義要求的文檔。

RFC 2368 - mailto URL 模式。

mailto URL 模式的解析要求。

RFC 1808 - 相對統(tǒng)一資源定位符

這個請求注釋包括聯(lián)結(jié)絕對和相對 URL 的規(guī)則,其中包括大量控制邊界情況處理的 "異常示例"。

RFC 1738 - 統(tǒng)一資源定位符 (URL)

這指明了絕對 URL 的正式語義和句法。