该模块定义了一个标准接口,用于在组件中解析统一资源定位符(URL)字符串(寻址方案,网络位置,路径等),将组件组合回URL字符串,并将“相对URL”转换为绝对URL给出“基本URL”。
该模块旨在匹配相对统一资源定位器上的Internet 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
模块定义了分为两大类的功能:URL解析和URL引用。以下各节将详细介绍这些内容。
URL解析功能侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串。
urllib.parse.
urlparse
(urlstring,scheme ='',allow_fragments = True )
将URL解析为六个组件,返回一个名为tuple的6项。这对应于URL的一般结构:scheme://netloc/path;parameters?query#fragment
。每个元组项都是一个字符串,可能是空的。组件不会以较小的部分分解(例如,网络位置是单个字符串),并且不会展开%escapes。如上所示的分隔符不是结果的一部分,除了路径组件中的前导斜杠,如果存在则保留。例如:
>>> from urllib.parse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
>>> o # doctest: +NORMALIZE_WHITESPACE
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
params='', query='', fragment='')
>>> o.scheme
'http'
>>> o.port
80
>>> o.geturl()
'http://www.cwi.nl:80/%7Eguido/Python.html'
遵循语法规范 RFC 1808,只有在'//'正确引入的情况下,urlparse才会识别netloc。否则,输入被假定为相对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='')
该方案论证给出了默认的寻址方案,将仅用于当URL不指定一个。它应该与urlstring的类型(文本或字节)相同,但''
始终允许使用默认值,并b''
在适当时自动转换为。
如果allow_fragments参数为false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并fragment
在返回值中设置为空字符串。
返回值是一个命名元组,这意味着它的项可以通过索引或命名属性访问,它们是:
属性 | 索引 | 值 | 价值,如果不存在 |
---|---|---|---|
scheme |
0 | URL方案说明符 | 方案参数 |
netloc |
1 | 网络位置部分 | 空字符串 |
path |
2 | 分层路径 | 空字符串 |
params |
3 | 最后一个路径元素的参数 | 空字符串 |
query |
4 | 查询组件 | 空字符串 |
fragment |
5 | 片段识别 | 空字符串 |
username |
用户名 | None |
|
password |
密码 | None |
|
hostname |
主机名(小写) | None |
|
port |
端口号为整数(如果存在) | None |
如果在URL中指定了无效端口,则读取该port
属性将引发ValueError
该异常。有关结果对象的更多信息,请参见结构化解析结果部分 。
netloc
属性中不匹配的方括号将引发a ValueError
。
中的字符netloc
属性,根据NFKC正常化(如所使用的编码IDNA)分解成任何的/
,?
, #
,@
,或:
将提高一个ValueError
。如果在解析之前分解URL,则不会引发错误。
与所有命名元组的情况一样,子类还有一些特别有用的附加方法和属性。一种这样的方法是_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 版更改: Added IPv6 URL parsing capabilities.
在3.3版更改:现在为所有URL方案解析片段(除非allow_fragment为false),按照RFC 3986。以前,存在支持片段的方案的白名单。
在 3.6 版更改: Out-of-range port numbers now raise ValueError
, instead of returning None
.
在 3.7.3 版更改: Characters that affect netloc parsing under NFKC normalization will now raise ValueError
.
urllib.parse.
parse_qs
(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )
解析作为字符串参数给出的查询字符串(类型为 application / x-www-form-urlencoded的数据)。数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。
可选参数keep_blank_values是一个标志,指示百分比编码查询中的空值是否应被视为空字符串。true值表示空格应保留为空字符串。默认的false值表示将忽略空白值并将其视为未包含它们。
可选参数strict_parsing是一个标志,指示如何处理解析错误。如果为false(默认值),则会以静默方式忽略错误。如果为true,则错误会引发ValueError
异常。
可选的encoding和errors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()
方法所接受的那样 。
可选参数max_num_fields是要读取的最大字段数。如果设置,则抛出a,ValueError
如果读取的字段数超过max_num_fields。
使用该urllib.parse.urlencode()
函数(doseq
参数设置为True
)将此类词典转换为查询字符串。
在 3.2 版更改: Add encoding and errors parameters.
在 3.7.2 版更改: Added max_num_fields parameter.
urllib.parse.
parse_qsl
(qs,keep_blank_values = False,strict_parsing = False,encoding ='utf-8',errors ='replace',max_num_fields = None )
解析作为字符串参数给出的查询字符串(类型为 application / x-www-form-urlencoded的数据)。数据作为名称,值对的列表返回。
可选参数keep_blank_values是一个标志,指示百分比编码查询中的空值是否应被视为空字符串。true值表示空格应保留为空字符串。默认的false值表示将忽略空白值并将其视为未包含它们。
可选参数strict_parsing是一个标志,指示如何处理解析错误。如果为false(默认值),则会以静默方式忽略错误。如果为true,则错误会引发ValueError
异常。
可选的encoding和errors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()
方法所接受的那样 。
可选参数max_num_fields是要读取的最大字段数。如果设置,则抛出a,ValueError
如果读取的字段数超过max_num_fields。
使用此urllib.parse.urlencode()
函数将这些对列表转换为查询字符串。
在 3.2 版更改: Add encoding and errors parameters.
在 3.7.2 版更改: Added max_num_fields parameter.
urllib.parse.
urlunparse
(部分)
从返回的元组构造URL urlparse()
。该部分 参数可以是任何六个项目迭代。如果最初解析的URL具有不必要的分隔符(例如,?
带有空查询的URL ; RFC声明这些是等效的),这可能会导致稍微不同但等效的URL 。
urllib.parse.
urlsplit
(urlstring,scheme ='',allow_fragments = True )
这类似于urlparse()
,但不会从URL中拆分params。通常应使用此代替,urlparse()
如果更新的URL语法允许将参数应用于URL 的路径部分的每个段(请参阅RFC 2396)是通缉犯。需要单独的功能来分离路径段和参数。此函数返回一个名为tuple的5项 :
(addressing scheme, network location, path, query, fragment identifier).
返回值是一个命名元组,其项可以通过索引或命名属性访问:
属性 | 索引 | 值 | 价值,如果不存在 |
---|---|---|---|
scheme |
0 | URL方案说明符 | 方案参数 |
netloc |
1 | 网络位置部分 | 空字符串 |
path |
2 | 分层路径 | 空字符串 |
query |
3 | 查询组件 | 空字符串 |
fragment |
4 | 片段识别 | 空字符串 |
username |
用户名 | None |
|
password |
密码 | None |
|
hostname |
主机名(小写) | None |
|
port |
端口号为整数(如果存在) | None |
如果在URL中指定了无效端口,则读取该port
属性将引发ValueError
该异常。有关结果对象的更多信息,请参见结构化解析结果部分 。
netloc
属性中不匹配的方括号将引发a ValueError
。
中的字符netloc
属性,根据NFKC正常化(如所使用的编码IDNA)分解成任何的/
,?
, #
,@
,或:
将提高一个ValueError
。如果在解析之前分解URL,则不会引发错误。
在 3.6 版更改: Out-of-range port numbers now raise ValueError
, instead of returning None
.
在 3.7.3 版更改: Characters that affect netloc parsing under NFKC normalization will now raise ValueError
.
urllib.parse.
urlunsplit
(部分)
将返回的元组元素组合urlsplit()
为完整的URL作为字符串。该部分参数可以是任何五个项目的迭代。如果最初解析的URL具有不必要的分隔符(例如,带有空查询的?; RFC声明这些是等效的),这可能会导致略有不同但等效的URL。
urllib.parse.
urljoin
(base,url,allow_fragments = True )
通过将“基本URL”(基础)与另一个URL(URL)组合来构造完整(“绝对”)URL 。非正式地,这使用基本URL的组件,特别是寻址方案,网络位置和路径(的一部分),以在相对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参数具有相同的含义,默认为 urlparse()
。
注解
如果url是绝对URL(即以//
或开头scheme://
),则url的主机名和/或方案将出现在结果中。例如:
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html',
... '//www.python.org/%7Eguido')
'http://www.python.org/%7Eguido'
如果您不想要这种行为,请使用和 预处理url,删除可能的scheme和netloc部分。urlsplit()
urlunsplit()
在3.5版更改:行为更新以匹配在中定义的语义RFC 3986。
urllib.parse.
urldefrag
(url )
如果url包含片段标识符,则返回 没有片段标识符的url的修改版本,并将片段标识符作为单独的字符串。如果url中没有片段标识符,则返回未修改的url和空字符串。
返回值是一个命名元组,其项可以通过索引或命名属性访问:
属性 | 索引 | 值 | 价值,如果不存在 |
---|---|---|---|
url |
0 | 没有片段的网址 | 空字符串 |
fragment |
1 | 片段识别 | 空字符串 |
有关结果对象的更多信息,请参见结构化解析结果部分。
在 3.2 版更改: Result is a structured object rather than a simple 2-tuple.
URL解析函数最初设计为仅对字符串进行操作。实际上,能够将正确引用和编码的URL作为ASCII字节序列进行操作是很有用的。因此,URL此模块中的所有功能解析上操作bytes
,并 bytearray
在除对象str
的对象。
如果str
传入数据,结果也将只包含 str
数据。如果传入bytes
或bytearray
传入数据,则结果将仅包含bytes
数据。
尝试在单个函数调用中或 在单个函数调用中混合str
数据将导致 引发,而尝试传入非ASCII字节值将触发。bytes
bytearray
TypeError
UnicodeDecodeError
为了支持在str
和 之间更容易地转换结果对象bytes
,来自URL解析函数的所有返回值都提供encode()
方法(当结果包含str
数据时)或decode()
方法(当结果包含bytes
数据时)。这些方法的签名与相应str
和bytes
方法的签名相匹配 (除了默认编码'ascii'
而不是'utf-8'
)。每个都生成一个相应类型的值,该值包含bytes
数据(用于encode()
方法)或str
数据(用于 decode()
方法)。
需要对可能包含非ASCII数据的潜在不正确引用的URL进行操作的应用程序需要在调用URL解析方法之前从字节到字符进行自己的解码。
本节中描述的行为仅适用于URL解析功能。URL引用函数在生成或使用字节序列时使用自己的规则,如各个URL引用函数的文档中所述。
在 3.2 版更改: URL parsing functions now accept ASCII encoded byte sequences
从结果对象urlparse()
,urlsplit()
和 urldefrag()
功能是子类的tuple
类型。这些子类添加了文档中列出的那些函数的属性,上一节中描述的编码和解码支持,以及另一种方法:
urllib.parse.SplitResult.
geturl
()
将原始URL的重新组合版本作为字符串返回。这可能与原始URL的不同之处在于,可以将方案规范化为小写,并且可以丢弃空组件。具体而言,将删除空参数,查询和片段标识符。
对于urldefrag()
结果,将仅删除空片段标识符。对于urlsplit()
和urlparse()
结果,将对此方法返回的URL进行所有注意的更改。
如果通过原始解析函数传回,则此方法的结果保持不变:
>>> 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/'
以下类提供了对str
对象进行操作时结构化解析结果的实现:
class urllib.parse.
DefragResult
(url,fragment )
urldefrag()
包含str
数据的结果的具体类。该encode()
方法返回一个DefragResultBytes
实例。
3.2 新版功能.
class urllib.parse.
ParseResult
(scheme,netloc,path,params,query,fragment )
urlparse()
包含str
数据的结果的具体类。该encode()
方法返回一个ParseResultBytes
实例。
class urllib.parse.
SplitResult
(scheme,netloc,path,query,fragment )
urlsplit()
包含str
数据的结果的具体类。该encode()
方法返回一个SplitResultBytes
实例。
以下类在操作bytes
或bytearray
对象时提供解析结果的实现:
class urllib.parse.
DefragResultBytes
(url,fragment )
urldefrag()
包含bytes
数据的结果的具体类。该decode()
方法返回一个DefragResult
实例。
3.2 新版功能.
class urllib.parse.
ParseResultBytes
(scheme,netloc,path,params,query,fragment )
urlparse()
包含bytes
数据的结果的具体类。该decode()
方法返回一个ParseResult
实例。
3.2 新版功能.
class urllib.parse.
SplitResultBytes
(scheme,netloc,path,query,fragment )
urlsplit()
包含bytes
数据的结果的具体类。该decode()
方法返回一个SplitResult
实例。
3.2 新版功能.
URL引用功能侧重于获取程序数据,并通过引用特殊字符和适当编码非ASCII文本使其可以安全地用作URL组件。如果上面的URL解析函数尚未涵盖该任务,它们还支持逆转这些操作以从URL组件的内容重新创建原始数据。
urllib.parse.
quote
(string,safe ='/',encoding = None,errors = None )
使用转义替换字符串中的特殊字符%xx
。'_.-~'
从不引用字母,数字和字符。默认情况下,此函数用于引用URL的路径部分。可选的safe 参数指定不应引用的其他ASCII字符---其默认值为'/'
。
字符串可以是a str
或a bytes
。
在 3.7 版更改: Moved from RFC 2396来RFC 3986用于引用URL字符串。“〜”现在包含在保留字符集中。
可选的encoding和errors参数指定如何处理str.encode()
方法所接受的非ASCII字符。 编码默认为'utf-8'
。错误默认为'strict'
,意味着不支持的字符引发 UnicodeEncodeError
。 如果string是a 或a,则不得提供编码和错误。bytes
TypeError
注意相当于 。quote(string, safe, encoding, errors)
quote_from_bytes(string.encode(encoding, errors),safe)
示例:收益率。quote('/El Niño/')
'/El%20Ni%C3%B1o/'
urllib.parse.
quote_plus
(string,safe ='',encoding = None,errors = None )
喜欢quote()
,但也可以用加号替换空格,这是在构建查询字符串以进入URL时引用HTML表单值所需的。原始字符串中的加号将被转义,除非它们包含在 安全中。它也没有安全的默认值'/'
。
示例:收益率。quote_plus('/El Niño/')
'%2FEl+Ni%C3%B1o%2F'
urllib.parse.
quote_from_bytes
(bytes,safe ='/' )
喜欢quote()
,但接受一个bytes
对象而不是一个 str
,并且不执行字符串到字节的编码。
示例:quote_from_bytes(b'a&\xef')
收益率 'a%26%EF'
。
urllib.parse.
unquote
(string,encoding ='utf-8',errors ='replace' )
用%xx
单字符等效替换转义符。可选的encoding和errors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()
方法所接受的那样 。
字符串必须是str
。
编码默认为'utf-8'
。 错误默认为'replace'
,表示无效序列被占位符字符替换。
示例:unquote('/El%20Ni%C3%B1o/')
收益率。'/El Niño/'
urllib.parse.
unquote_plus
(string,encoding ='utf-8',errors ='replace' )
喜欢unquote()
,但也可以按空格替换加号,这是取消引用HTML表单值所必需的。
字符串必须是str
。
示例:unquote_plus('/El+Ni%C3%B1o/')
收益率。'/El Niño/'
urllib.parse.
unquote_to_bytes
(字符串)
用%xx
单个八位字节等效替换转义符,并返回一个 bytes
对象。
字符串可以是a str
或a bytes
。
如果是a str
,则字符串 中未转义的非ASCII字符被编码为UTF-8字节。
示例:unquote_to_bytes('a%26%EF')
收益率b'a&\xef'
。
urllib.parse.
urlencode
(query,doseq = False,safe ='',encoding = None,errors = None,quote_via = quote_plus )
转换映射对象或两个元素的元组,其可以包含的序列str
或bytes
对象,为百分比编码的ASCII文本串。如果结果字符串将用作函数POST操作的数据,urlopen()
则应将其编码为字节,否则将导致a TypeError
。
结果字符串是key=value
由'&'
字符分隔的一系列对,其中键和值都使用quote_via 函数引用。默认情况下,quote_plus()
用于引用值,这意味着空格被引用为'+'
字符,'/'字符被编码为%2F
,遵循GET请求(application/x-www-form-urlencoded
)的标准。可以作为quote_via传递的替代函数是quote()
,它将空格编码为%20
不编码'/'字符。为了最大程度地控制所引用的内容,请使用 quote
并指定安全值。
当一个两元素元组序列用作查询 参数时,每个元组的第一个元素是一个键,第二个元素是一个值。值元素本身可以是一个序列,在这种情况下,如果可选参数doseq的计算结果为True
, 则为键的值序列的每个元素生成key=value
单独的分隔对'&'
。编码字符串中的参数顺序将与序列中参数元组的顺序匹配。
在安全,编码和错误参数传递到 quote_via(该编码和错误当查询元素是参数仅传递str
)。
要反转此编码过程,parse_qs()
并parse_qsl()
在此模块中提供将查询字符串解析为Python数据结构。
请参阅urllib示例,了解如何使用urlencode方法为URL或POST数据生成查询字符串。