urllib模块学习(二)----urllib.parse模块与urllib.error模块


urllib.parse

urllib.parse模块是一个用于解析URL的工具包,支持各种对URL的操作,包括拆分、拼接、编码、解码等。

urllib.parse模块在功能上分为两大类:URL parsing(URL解析)和URL quoting(URL引用)。

URL Parsing

URL解析函数专注于将url字符串拆分为各种组件,或者将url组件合并为url字符串。
即拆分和拼接。

与之相关的函数有:

1.urlparse()函数

语法格式:

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

作用:

将url字符串拆分成6个组件,并返回一个包含这些组件的ParseResult对象。
ParseResult对象类似这种形式:

ParseResult(scheme='', netloc='', path='', params='', query='', fragment='')

该对象包含六个组件,正好与URL的一般格式相对应,即:
scheme://netloc/path;parameters?query#fragment
但有时某些ParseResult项将是空项,因为并不是所有URL都能包含所有这些组件。

另外注意,端口号port不能超出指定的范围,否则将引发ValueError错误。在Python3.6版本之前端口号超出范围仅返回None,不引发错误。

示例:

from urllib import parse
tup = parse.urlparse("http://baidu.com")
print(tup)

#output:
ParseResult(scheme='http', netloc='baidu.com', path='', params='', query='', fragment='')

参数说明:

urlstring:

必填项。待解析的url。

scheme:

采用的协议。如果在urlstring中已指定则该参数可省略。
这里注意的是只有在由"//"引导下的netloc字符串才会被正确识别,否则将被认为是path。

例如:

from urllib import parse
tup = parse.urlparse("//baidu.com",scheme='http')
print(tup)

#output:
ParseResult(scheme='http', netloc='baidu.com', path='', params='', query='', fragment='')

tup = parse.urlparse("baidu.com",scheme='http')
#output:
ParseResult(scheme='http', netloc='', path='baidu.com', params='', query='', fragment='')

allow_fragments:

设置是否忽略fragment即锚点,该参数默认为True,即不忽略。如果设置为False,则该参数会被忽略。


ParseResult对象

ParseResult在官方文档里被描述为一个named tuple,即一个具名元组,它在本质上仍然为一个元组,可以用索引的方式来访问里面的数据。对照表如下:

同样的,named tuple对象的所有方法也适用于ParseResult,在Python官方文档中介绍了一个方法作为样例:_replace()方法,它用于将某些项替换为指定的字段。

示例:

from urllib import parse
tup = parse.urlparse("//baidu.com")
print(tup._replace(scheme='http')) #注意该方法返回一个新的named tuple,因此原named tuple仍未被改变

#output:
ParseResult(scheme='http', netloc='baidu.com', path='', params='', query='', fragment='')

有关named tuple的介绍与用法将在以后抽空整理出一篇博客发出来(因为这个地方我也不是太了解):
传送门flag:


2.urlunparse()函数

作用:

urlunparse()函数与urlparse()函数作用刚好相反,它用于将url组件拼接成一个完整的url。该函数接受一个列表或者元组作为形参,也可以是可迭代的对象。

示例:

from urllib.parse import urlunparse
url = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(url))

#output:
http://www.baidu.com/index.html;user?a=6#comment

注意六个参数必须都要指定,即便它不存在,此时指定为空,如下:

from urllib.parse import urlunparse
url = ['http','www.baidu.com','','','','']
print(urlunparse(url))

#output:
http://www.baidu.com

3.urlsplit()函数

作用:

与urlprase()类似,只不过params将被合并到path中,因此返回一个包含五个项的SplitResult对象,该对象为一个named tuple,它包含如下项:
(scheme,netloc,path,query,fragment)

因为用法和urlparse()基本相同,不再多说。


4.urlunsplit()函数

作用:

与urlunparse()相似,不再多说。


5.urljoin()函数

语法:

urljoin(base url,url,allow_fragments=True)

作用:

该函数接收两个参数,这两个参数都必须为url的组件或者是一个完整的url。其中第一个为base url,这个url可能并不完整,此时需要第二个url为它提供它所缺失的组件部分。这种提供遵循以下规则:

  • 如果base url没有该组件,而第二个url具有该组件,则添加到base url中。
  • base url的某些组件是无意义的,它们是params、query和fragment,即合理的base
    url只包含scheme、netloc、path这几种组件中的几个。
  • 如果base url和第二个url中的某些组件存在冲突,则以第二个url中的该组件为准,并将base url更正。

最后,该函数返回一个url,即更正后的base url。

示例:

from urllib.parse import urljoin
print(urljoin('http://www.baidu.com','index.html'))
print(urljoin('http://www.baidu.com','http://cdblogs.com/index.html'))
print(urljoin('http://www.baidu.com','?id=2#comment'))
print(urljoin('http://www.baidu.com?id=3','https://cnblog.com/index.html'))

#output:
http://www.baidu.com/index.html
http://cdblogs.com/index.html
http://www.baidu.com?id=2#comment
https://cnblog.com/index.html

6.urlencode()函数

url解析函数只能对str对象和bytes以及bytearray对象进行操作,如果传入str,则返回结果也只包含str数据,如果传入bytes或者bytearray数据,则返回结果也将只包含bytes数据。

为了支持str与bytes之间更便捷的转换,urllib.parse模块提供有urlencode()函数,它返回bytes数据,支持传入除str和bytes之外的其它数据对象。

一个比较显著的例子如在使用urlopen()函数时传入的params参数,它本时一个字典,因此需要urlencode()函数提前把它转换成bytes再传入。


7.parse_qs()函数

作用:

与urlencode()函数作用相反,用来反序列化,如将GET参数再转换为字典。


8.parse_qsl()函数

作用:

将参数转换为元组组成的列表。

这两个函数不再多说,认识就好。

另外,parse模块下还定义了一些类,如ParseResult、SplitResult等,感兴趣的请查阅官方文档。


URL Quoting

1.quote()函数

语法格式:

urllib.parse.quote(string,safe='/',encoding=None,errors=None)

作用:

该方法用于获取URL数据并将其编码,使其可以用于URL字符串中,因为URL中的某些特殊字符串可能不能打印或者无法被Web服务器作为有效URL接收。这时就需要先用quote()函数将之编码为可被识别的以及可在URL字符串中使用的等价字符串。
比如URL中的某些参数带有中文的情况,如果不使用quote()就有可能导致乱码。

参数说明:

string:

可以是str,也可以是bytes型数据。其中,下划线,句号,逗号,斜线和字母数字这类符号不需要转化,其它的则需要转化。另外,那些对URL不能使用的字符前会被加上百分号(%)同时转换成十六进制,从而被明显的标识出来,即<%xx>的形式。

safe:

safe字符串可包含一些不能转换的字符,默认是斜线(/)。

encoding、errors:

这两个参数指定如何处理str.encode()方法接受的非ascii字符。

示例:

from urllib.parse import quote
key = '数据'
url = 'http://baidu.com/?key=' + quote(key)
print(url)

#output:
http://baidu.com/?key=%E6%95%B0%E6%8D%AE

2.quote_plus()函数

作用:

语法与quote()完全一样,只是它还可以将空格编码成加号(+)。使用该方法,原始字符串中的加号将被转义,除非它们被包含在safe参数中。


3.unquote()与unquote_plus()函数

语法格式:

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

作用:

与quote()与quote_plus()相反,用于URL解码。
这两个函数的参数string都要求必须是一个str。
unquote()函数将包括<%xx>在内的所有字符解码,并返回一个字符串。
unquote_plus()在上面的基础上还会将加号转换为空格。
返回类型均为str。

4.quote_from_bytes()函数

语法格式:

urllib.parse.quote_from_bytes(bytes, safe='/')

作用:

类似于quote(),不过它只接受bytes对象,并且不执行string到bytes的编码。
quote(string,safe,encoding,errors) 与 quote_from_bytes(string.encoding(encoding,errors),safe)等价。

5.unquote_to_bytes(string)函数

作用:

类似于unquote(),不过它接受一个str或者bytes,返回一个bytes object。


urllib.error模块

urllib.error模块为urllib.request所引发的异常定义了异常类。基础异常类是URLError。

该模块的内容不多,具体有需要的可参阅官方文档:
https://docs.python.org/zh-cn/3.7/library/urllib.error.html

参考:
https://docs.python.org/zh-cn/3.7/library/urllib.parse.html
https://www.cnblogs.com/zhangxinqi/p/9170312.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值