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