Python网络爬虫技术与实战
上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 你好世界