Python2转Python3报错TypeError: a bytes-like object is required求助
解决Python 3中urlopen返回bytes导致的TypeError问题
这个坑我之前迁移代码时也踩过,太典型了!
问题根源
在Python 2里,urllib2.urlopen()返回的直接是字符串对象,但Python 3的urllib.request.urlopen()返回的是bytes类型对象——就是你看到的带b前缀的内容。当你用字符串的操作(比如用split()、和普通字符串拼接/比较)去处理这个bytes对象时,就会触发TypeError: a bytes-like object is required, not 'str'错误。
解决方案
核心就是把获取到的bytes内容解码成字符串,常用的编码是utf-8,如果目标文档是其他编码(比如gbk)就换成对应的编码就行。
举个实际的修改例子:
from urllib.request import urlopen # 获取响应 response = urlopen("你的目标URL") # 将bytes解码为字符串,这里用utf-8,可根据实际编码调整 content_str = response.read().decode('utf-8') # 现在你可以正常用字符串操作处理content_str了 print(content_str.split())
如果不确定文档编码,还可以从响应头里自动获取:
from urllib.request import urlopen response = urlopen("你的目标URL") # 从响应头提取编码 charset = response.info().get_content_charset() # 用获取到的编码解码 content_str = response.read().decode(charset)
额外提醒
反过来,如果之后需要把字符串转成bytes(比如发送POST请求时),记得用字符串.encode('utf-8')来转换,保持类型一致就不会再踩这类类型不匹配的坑啦。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

