
上QQ阅读APP看书,第一时间看更新
3.2.3 URL编码和URL解码
在爬取过程中,不可避免会涉及中文字符问题;因此在Python中,URL需要对中文等非ASCII码字符进行参数的编码与解码。例如当请求数据为字典data={k1:v1,k2:v2},且参数中包含中文或者“?”“=”等特殊符号时,通过URL编码可将data转化为特定格式k1=v1&k2=v2,并且将中文和特殊符号进行编码,以避免发生歧义。
1.URL编码
1)对字符串编码,可使用urllib.parse包下的quote(string,safe='/',encoding=None,errors=None,errors='replace')方法。
2)对json格式的参数名和值编码,可使用urllib.parse包下的urlencode(query,doseq=False,safe='',encoding=None,errors=None,quote_via=quote_plus)方法。
2.URL解码
解码可使用urllib.parse包下的unquote(string,encoding='utf-8',errors='replace')方法。
对于中文等非ASCII码字符,URL的编码与解码方式如下例所示。
【例3-6】编码和解码函数实例
1 from urllib import parse 2 from urllib import request 3 url = 'http://www.baidu.com/s?' 4 dict1 ={'wd': '百度翻译'} 5 # unlencode()将字典{k1:v1,k2:v2}转化为k1=v1&k2=v2 6 url_data = parse.urlencode(dict1) 7 # url_data:wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91 8 print(url_data) 9 # 读取URL响应结果 10 data = request.urlopen((url+url_data)).read() 11 # 用utf8对响应结果编码 12 data = data.decode('utf-8') 13 # 解码URL 14 url_org = parse.unquote(url_data) 15 print(url_org) 16 str1 = 'hello world 你好世界' 17 # 对字符串编码 18 str2 = parse.quote(str1) 19 print(str2) 20 # 解码字符串 21 str3 = parse.unquote(str2) 22 print(str3)
运行结果如下所示:
wd=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91 wd=百度翻译 hello%20world%20%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C hello world 你好世界