python3.7导入urllib2报错以及出现can't concat str to bytes解决的办法

在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以前都会被编码为字节