urllib库(三)parse模块:quote()/quote_plus(),unquote()/unquote_plus(),quote_from_bytes()

urllib.parse模块在功能上分为两大类:URL parsing(URL解析)和URL quoting(URL引用)
上一节已经介绍了url解析 本节介绍url引用
URL解析传送门(https://blog.csdn.net/Wjf7496/article/details/109787586)

(1)quote()/quote_plus()

上一节介绍的urllib.parse.urlencode()函数是对一个字典或者sequence of 'two-tuple'
进行编码
若只是对单个str或者bytes编码则需要使用quote()/quote_plus()

函数定义
urllib.parse.quote(string,safe='/',encoding=None,errors=None)
	string:
		strbytes型数据
		其中下划线,句号,逗号,斜线和字母数字这类符号不需要转化,其它的则需要转化。
		另外URL不能使用的字符(如中文)前会被加上百分号(%)同时转换成十六进制,即<%xx>的形式
	safe:
		safe字符串包含一些不能转换的字符,默认是斜线(/)。
	encoding、errors:
		这两个参数指定如何处理str.encode()方法接受的非ascii字符
	
二者的区别在于对特殊字符编码的方式不一样 如
	quote()      不编码斜线;        空格‘ ’编码为‘%20’
	quote_plus() 会编码斜线为‘%2F; 空格‘ ’编码为‘+’
	等等


>>> from urllib import parse
>>> parse.quote('a&b/c')  
'a%26b/c'
>>> parse.quote_plus('a&b/c')  
'a%26b%2Fc'

>>> parse.quote('a&b c')
'a%26b%20c'
>>> parse.quote_plus('a&b c')
'a%26b+c'

编码后的url传递后接受完毕就要解码,urllib提供了unquote(),urluquote_plus()两个函数实现url解码,没有urldecode()!

(2)unquote()/unquote_plus()

unquote()
	unquote(string, encoding='utf-8', errors='replace')
	不解码加号,默认string的编码utf-8
unquote_plus() 
	unquote_plus(string, encoding='utf-8', errors='replace')
	加号解码为空格 默认string的编码utf-8
	
二者的返回值类型都是str	
注意这里的encoding指定的是string参数的编码格式,不是终端编码格式

from urllib import parse
print(parse.unquote('1+2'))# '1+2'
print(parse.unquote_plus('1+2'))# '1 2'

终端utf-8:
>>> parse.quote('魔兽')
'%E9%AD%94%E5%85%BD'
>>> parse.unquote('%E9%AD%94%E5%85%BD')
'魔兽'
>>> parse.unquote(parse.quote('魔兽'))
'魔兽'

urlencode时quote()就是把字符串'魔兽'转车utf-8编码'\xe9\xad\x94\xe5\x85\xbd'
然后把\x替换成%得到'%E9%AD%94%E5%85%BD'
urldecode时unquote()这个函数的输出是对应中文'魔兽'在utf-8下的编码'\xe9\xad\x94\xe5\x85\xbd'得到中文'魔兽'

那么如果终端是gbk编码的,解码utf-8的字符串需要指定encoding='utf-8'输出,否则就乱码 
同样在终端utf-8下解码gbk的字符串也会乱码,需要指定参数encoding='gbk'
因为quote()unquote()默认编码都是utf-8

终端utf-8编码:
'魔兽'的gbk编码是'\xc4\xa7\xca\xde'

>>> parse.unquote('%C4%A7%CA%DE')
'ħ��'
>>> parse.unquote('%C4%A7%CA%DE',encoding='gbk')
'魔兽'

(3)quote_from_bytes()/unquote_from_bytes()

(1)quote_from_bytes()
	类似于quote(),
	不过它只接受bytes,并且不执行string到bytes的编码
	str 需要先转成bytes 两种办法:
		str.encode(encoding)bytes(str,encoding)

quote(string,safe,encoding,errors) 与 
quote_from_bytes(str.encode(encoding),safe)等价。`

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

parse模块包含的常用方法总结(https://blog.csdn.net/qq_36759224/article/details/99711754)

你可能感兴趣的:(爬虫学习,爬虫)