该模块定义了一个标准接口,用于在组件中解析统一资源定位符(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组件组合为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.
解析ASCII编码字节
URL解析函数最初设计为仅对字符串进行操作。实际上,能够将正确引用和编码的URL作为ASCII字节序列进行操作是很有用的。因此,URL此模块中的所有功能解析上操作bytes,并 bytearray在除对象str的对象。
如果str传入数据,结果也将只包含 str数据。如果传入bytes或bytearray传入数据,则结果将仅包含bytes数据。
尝试在单个函数调用中或 在单个函数调用中混合str数据将导致 引发,而尝试传入非ASCII字节值将触发。bytesbytearrayTypeErrorUnicodeDecodeError
为了支持在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引用
URL引用功能侧重于获取程序数据,并通过引用特殊字符和适当编码非ASCII文本使其可以安全地用作URL组件。如果上面的URL解析函数尚未涵盖该任务,它们还支持逆转这些操作以从URL组件的内容重新创建原始数据。
urllib.parse.quote(string,safe ='/',encoding = None,errors = None )
使用转义替换字符串中的特殊字符%xx。'_.-~'从不引用字母,数字和字符。默认情况下,此函数用于引用URL的路径部分。可选的safe 参数指定不应引用的其他ASCII字符---其默认值为'/'。
在 3.7 版更改: Moved from RFC 2396来RFC 3986用于引用URL字符串。“〜”现在包含在保留字符集中。
可选的encoding和errors参数指定如何处理str.encode()方法所接受的非ASCII字符。 编码默认为'utf-8'。错误默认为'strict',意味着不支持的字符引发 UnicodeEncodeError。 如果string是a 或a,则不得提供编码和错误。bytesTypeError
注意相当于 。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,则字符串 中未转义的非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数据生成查询字符串。
本文介绍了Python的urllib.parse模块,用于解析和操作URL。该模块支持多种URL方案,提供URL解析、组合、转换等功能,包括将URL拆分为组件、合并组件为URL字符串、处理相对URL等。此外,还详细说明了URL引用的处理,如编码、解码和引用特殊字符。urllib.parse模块适用于处理和操作URL字符串,是Python爬虫开发中的重要工具。

2053

被折叠的 条评论
为什么被折叠?



