在python3中,没有了urllib2包,而是转为了urllib.requestpython
能够这么理解:urllib2 == urllib.requestjson
在python3中,能够说优化了原来的python2中得urllib2包,代码以下服务器
import urllib.request优化
with urllib.request.urlopen('http://www.python.org/') as f:编码
print(f.read(300))url
上述代码返回的是bytes对象,其没法肯定从http服务器接收的字节流的编码code
因为python.org使用的是utf-8编码,咱们能够用相同的方法解码其对象以下对象
with urllib.request.urlopen() as f:utf-8
f.read().decode('utf-8))ci
下面重点来了,在请求URL的时候有时候会报不能合并字符串到字节的错,这是由于类型不一样。下面这样解决
while network_retry: try: print({'status':json.dumps(data)}) status = urllib.parse.urlencode({'status':json.dumps(data)}) print('the request is: ',status) # req_status = urllib.request.Request(requrl_task_status, status) # res_status = urllib.request.urlopen(req_status) with urllib.request.urlopen(requrl_task_status, status) as res_status: print(res_status.read(100).decode('utf-8')) print('the request1 is',res_status.read().decode('utf-8'))
这是我今天写的代码,可是每次到第六行就运行不下去了,查了官方文档才知道是哪里出了问题
while network_retry: try: print({'status':json.dumps(data)}) status = urllib.parse.urlencode({'status':json.dumps(data)}) status = status.encode('ascii') # 先编码为ASCII而后传给urlopen print('the request is: ',status) # req_status = urllib.request.Request(requrl_task_status, status) # res_status = urllib.request.urlopen(req_status) with urllib.request.urlopen(requrl_task_status, status) as res_status: print(res_status.read(100).decode('utf-8'))
原来是在python中默认编码是utf-8,在请求一个URL和字典对象时应该先转为ascii编码,而后才能和字节码合并,官方文档是这样解释的:从urlopen中输出的params做为数据发送到URLopen以前都会被编码为字节