python爬虫内置库之urllib.parse---URL解析

本文介绍了Python的urllib.parse模块,用于解析和操作URL。该模块支持多种URL方案,提供URL解析、组合、转换等功能,包括将URL拆分为组件、合并组件为URL字符串、处理相对URL等。此外,还详细说明了URL引用的处理,如编码、解码和引用特殊字符。urllib.parse模块适用于处理和操作URL字符串,是Python爬虫开发中的重要工具。
摘要由CSDN通过智能技术生成

该模块定义了一个标准接口,用于在组件中解析统一资源定位符(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在返回值中设置为空字符串。

返回值是一个命名元组,这意味着它的项可以通过索引或命名属性访问,它们是:

属性索引价值,如果不存在
scheme0URL方案说明符方案参数
netloc1网络位置部分空字符串
path2分层路径空字符串
params3最后一个路径元素的参数空字符串
query4查询组件空字符串
fragment5片段识别空字符串
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_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 版更改: Add encoding and errors parameters.

在 3.7.2 版更改: Added max_num_fields parameter.

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 版更改: Add encoding and errors parameters.

在 3.7.2 版更改: Added max_num_fields parameter.

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

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

属性索引价值,如果不存在
scheme0URL方案说明符方案参数
netloc1网络位置部分空字符串
path2分层路径空字符串
query3查询组件空字符串
fragment4片段识别空字符串
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.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和空字符串。

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

属性索引价值,如果不存在
url0没有片段的网址空字符串
fragment1片段识别空字符串

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

在 3.2 版更改: Result is a structured object rather than a simple 2-tuple.

解析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 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.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 版更改: Moved from 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数据生成查询字符串。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值