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

博客介绍了Python3中urllib2包转为urllib.request,优化了原Python2的urllib2包。给出使用urllib.request请求URL的代码示例,指出返回的是bytes对象,需解码。还提到请求URL时可能出现类型不匹配错误,应将请求的URL和字典对象先转为ascii编码再与字节码合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在python3中,没有了urllib2包,而是转为了urllib.request

可以这么理解:urllib2 == urllib.request

在python3中,可以说优化了原来的python2中得urllib2包,代码如下

import urllib.request

with urllib.request.urlopen('http://www.python.org/') as f:

          print(f.read(300))

上述代码返回的是bytes对象,其无法确定从http服务器接收的字节流的编码

由于python.org使用的是utf-8编码,我们可以用相同的方法解码其对象如下

with urllib.request.urlopen() as f:

          f.read().decode('utf-8))

下面重点来了,在请求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之前都会被编码为字节

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值