urllib.parse- 解析URL的组件说明

原创 创建时间:2019-09-11 访问量:11 赞:0 踩:0

urllib.parse- 将URL解析为组件

源代码: Lib / urllib / parse.py


该模块定义了一个标准接口,用于在组件中解析统一资源定位符(URL)字符串(寻址方案,网络位置,路径等),将组件组合回URL字符串,并将“相对URL”转换为绝对URL给出“基本URL”。

该模块旨在匹配相对统一资源定位器上的Internet RFC。它支持下列URL方案:fileftp, gopherhdlhttphttpsimapmailtomms, newsnntpprosperorsyncrtsprtspusftp, shttpsipsipssnewssvnsvn+sshtelnet, waiswswss

urllib.parse模块定义了分为两大类的功能:URL解析和URL引用。以下各节将详细介绍这些内容。

URL解析

URL解析功能侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串。

urllib.parse.urlparseurlstringscheme =''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

片段标识符

空字符串

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中已更改:添加了IPv6 URL解析功能。

在版本3.3中更改:现在为所有URL方案解析片段(除非allow_fragment为false),根据RFC 3986以前,存在支持片段的方案的白名单。

在版本3.6中更改:超出范围的端口号现在提高ValueError,而不是返回None

在版本3.7.3中更改:在NFKC规范化下影响netloc解析的字符现在将提升ValueError

urllib.parse.parse_qsqskeep_blank_values = Falsestrict_parsing = Falseencoding ='utf-8'errors ='replace'max_num_fields = None 

解析作为字符串参数给出的查询字符串(类型为 application / x-www-form-urlencoded的数据)。数据作为字典返回。字典键是唯一的查询变量名称,值是每个名称的值列表。

可选参数keep_blank_values是一个标志,指示百分比编码查询中的空值是否应被视为空字符串。true值表示空格应保留为空字符串。默认的false值表示将忽略空白值并将其视为未包含它们。

可选参数strict_parsing是一个标志,指示如何处理解析错误。如果为false(默认值),则会以静默方式忽略错误。如果为true,则错误会引发ValueError异常。

可选的encodingerrors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()方法所接受的那样 

可选参数max_num_fields是要读取的最大字段数。如果设置,则抛出a,ValueError如果读取的字段数超过max_num_fields

使用该urllib.parse.urlencode()函数(doseq 参数设置为True)将此类词典转换为查询字符串。

在3.2版中更改:添加编码错误参数。

版本3.7.2中已更改:添加了max_num_fields参数。

urllib.parse.parse_qslqskeep_blank_values = Falsestrict_parsing = Falseencoding ='utf-8'errors ='replace'max_num_fields = None 

解析作为字符串参数给出的查询字符串(类型为 application / x-www-form-urlencoded的数据)。数据作为名称,值对的列表返回。

可选参数keep_blank_values是一个标志,指示百分比编码查询中的空值是否应被视为空字符串。true值表示空格应保留为空字符串。默认的false值表示将忽略空白值并将其视为未包含它们。

可选参数strict_parsing是一个标志,指示如何处理解析错误。如果为false(默认值),则会以静默方式忽略错误。如果为true,则错误会引发ValueError异常。

可选的encodingerrors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()方法所接受的那样 

可选参数max_num_fields是要读取的最大字段数。如果设置,则抛出a,ValueError如果读取的字段数超过max_num_fields

使用此urllib.parse.urlencode()函数将这些对列表转换为查询字符串。

在3.2版中更改:添加编码错误参数。

版本3.7.2中已更改:添加了max_num_fields参数。

urllib.parse.urlunparse部分

从返回的元组构造URL urlparse()部分 参数可以是任何六个项目迭代。如果最初解析的URL具有不必要的分隔符(例如,?带有空查询的URL ; RFC声明这些是等效的),这可能会导致稍微不同但等效的URL 

urllib.parse.urlspliturlstringscheme =''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中更改:超出范围的端口号现在提高ValueError,而不是返回None

在版本3.7.3中更改:在NFKC规范化下影响netloc解析的字符现在将提升ValueError

urllib.parse.urlunsplit部分

将返回的元组元素组合urlsplit()为完整的URL作为字符串。部分参数可以是任何五个项目的迭代。如果最初解析的URL具有不必要的分隔符(例如,带有空查询的?; RFC声明这些是等效的),这可能会导致略有不同但等效的URL。

urllib.parse.urljoinbaseurlallow_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,删除可能的schemenetloc部分。urlsplit()urlunsplit()

在版本3.5中更改:更新行为以匹配在中定义的语义RFC 3986

urllib.parse.urldefragurl 

如果url包含片段标识符,则返回 没有片段标识符url的修改版本,并将片段标识符作为单独的字符串。如果url中没有片段标识符,则返回未修改的url和空字符串。

返回值是一个命名元组,其项可以通过索引或命名属性访问:

属性

指数

价值,如果不存在

url

0

没有片段的网址

空字符串

fragment

1

片段标识符

空字符串

有关结果对象的更多信息,请参见结构化解析结果部分

版本3.2中更改:结果是结构化对象而不是简单的2元组。

解析ASCII编码字节

URL解析函数最初设计为仅对字符串进行操作。实际上,能够将正确引用和编码的URL作为ASCII字节序列进行操作是很有用的。因此,URL此模块中的所有功能解析上操作bytes,并 bytearray在除对象str的对象。

如果str传入数据,结果也将只包含 str数据。如果传入bytesbytearray传入数据,则结果将仅包含bytes数据。

尝试在单个函数调用中或 在单个函数调用中混合str数据将导致 引发,而尝试传入非ASCII字节值将触发bytesbytearrayTypeErrorUnicodeDecodeError

为了支持在str和 之间更容易地转换结果对象bytes,来自URL解析函数的所有返回值都提供encode()方法(当结果包含str 数据时)或decode()方法(当结果包含bytes 数据时)。这些方法的签名与相应strbytes方法的签名相匹配 (除了默认编码'ascii'而不是'utf-8')。每个都生成一个相应类型的值,该值包含bytes数据(用于encode()方法)或str数据(用于 decode()方法)。

需要对可能包含非ASCII数据的潜在不正确引用的URL进行操作的应用程序需要在调用URL解析方法之前从字节到字符进行自己的解码。

本节中描述的行为仅适用于URL解析功能。URL引用函数在生成或使用字节序列时使用自己的规则,如各个URL引用函数的文档中所述。

在3.2版中更改: URL解析函数现在接受ASCII编码的字节序列

结构化解析结果

从结果对象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.DefragResulturlfragment 

urldefrag()包含str 数据的结果的具体类encode()方法返回一个DefragResultBytes 实例。

版本3.2中的新功能。

class urllib.parse.ParseResultschemenetlocpathparamsqueryfragment 

urlparse()包含str 数据的结果的具体类encode()方法返回一个ParseResultBytes 实例。

class urllib.parse.SplitResultschemenetlocpathqueryfragment 

urlsplit()包含str 数据的结果的具体类encode()方法返回一个SplitResultBytes 实例。

以下类在操作bytesbytearray对象时提供解析结果的实现

class urllib.parse.DefragResultBytesurlfragment 

urldefrag()包含bytes 数据的结果的具体类decode()方法返回一个DefragResult 实例。

版本3.2中的新功能。

class urllib.parse.ParseResultBytesschemenetlocpathparamsqueryfragment 

urlparse()包含bytes 数据的结果的具体类decode()方法返回一个ParseResult 实例。

版本3.2中的新功能。

class urllib.parse.SplitResultBytesschemenetlocpathqueryfragment 

urlsplit()包含bytes 数据的结果的具体类decode()方法返回一个SplitResult 实例。

版本3.2中的新功能。

URL引用

URL引用功能侧重于获取程序数据,并通过引用特殊字符和适当编码非ASCII文本使其可以安全地用作URL组件。如果上面的URL解析函数尚未涵盖该任务,它们还支持逆转这些操作以从URL组件的内容重新创建原始数据。

urllib.parse.quotestringsafe ='/'encoding = Noneerrors = None 

使用转义替换字符串中的特殊字符%xx'_.-~'从不引用字母,数字和字符默认情况下,此函数用于引用URL的路径部分。可选的safe 参数指定不应引用的其他ASCII字符 - 其默认值为'/'

字符串可以是a str或a bytes

在版本3.7中更改:已移至RFC 2396RFC 3986用于引用URL字符串。“〜”现在包含在保留字符集中。

可选的encodingerrors参数指定如何处理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_plusstringsafe =''encoding = Noneerrors = None 

喜欢quote(),但也可以用加号替换空格,这是在构建查询字符串以进入URL时引用HTML表单值所需的。原始字符串中的加号将被转义,除非它们包含在 安全中它也没有安全的默认值'/'

示例:收益率quote_plus('/El Niño/')'%2FEl+Ni%C3%B1o%2F'

urllib.parse.quote_from_bytesbytessafe ='/' 

喜欢quote(),但接受一个bytes对象而不是一个 str,并且不执行字符串到字节的编码。

示例:quote_from_bytes(b'a&\xef')收益率 'a%26%EF'

urllib.parse.unquotestringencoding ='utf-8'errors ='replace' 

%xx单字符等效替换转义符。可选的encodingerrors参数指定如何将百分比编码的序列解码为Unicode字符,如bytes.decode()方法所接受的那样 

字符串必须是str

编码默认为'utf-8'。 错误默认为'replace',表示无效序列被占位符字符替换。

示例:unquote('/El%20Ni%C3%B1o/')收益率'/El Niño/'

urllib.parse.unquote_plusstringencoding ='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.urlencodequerydoseq = Falsesafe =''encoding = Noneerrors = Nonequote_via = quote_plus 

转换映射对象或两个元素的元组,其可以包含的序列strbytes对象,为百分比编码的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数据生成查询字符串。

在3.2版中更改: Query参数支持字节和字符串对象。

3.5版中的新功能:quote_via参数。

也可以看看

RFC 3986 - 统一资源标识符

这是现行标准(STD66)。对urllib.parse模块的任何更改都应符合此要求。可以观察到某些偏差,这些偏差主要是为了向后兼容目的,以及主要浏览器中常见的某些事实上的解析要求。

RFC 2732 - URL中的文字IPv6地址的格式。

这指定了IPv6 URL的解析要求。

RFC 2396 - 统一资源标识符(URI):通用语法

描述统一资源名称(URN)和统一资源定位符(URL)的通用语法要求的文档。

RFC 2368 - mailto URL方案。

解析mailto URL方案的要求。

RFC 1808 - 相对统一资源定位符

此征求意见书包括加入绝对和相对URL的规则,包括管理边境案件处理的相当数量的“异常示例”。

RFC 1738 - 统一资源定位器(URL)

这指定了绝对URL的形式语法和语义。

评论
 我想说:
==已经到底了==
关注: 粉丝: 积分:
Copyright ©2018 工联信息网——打造最实用且免费的互联网资源共享社区
如有疑问和需求请致邮箱:need@glxxw2018.com
不良信息反馈及建议请致邮箱:accusation@glxxw2018.com
沪ICP备18018158号-1