类型错误:不能在类似字节的对象api上使用字符串模式

时间:2015-04-16 01:21:22

标签: python json string python-3.x urllib

import json
import urllib.request, urllib.error, urllib.parse

Name = 'BagFullOfHoles' #Random player
Platform = 'xone'#pc, xbox, xone, ps4, ps3

url = 'http://api.bfhstats.com/api/playerInfo?plat=' + Platform + '&name=' + Name
json_obj = urllib.request.urlopen(url)
data = json.load(json_obj)
print (data)

TypeError:不能在类字节对象上使用字符串模式

刚刚使用2to3.py,当我尝试修复它时出现此错误或其他错误。有指点的人吗?

2 个答案:

答案 0 :(得分:4)

json_obj = urllib.request.urlopen(url)返回HTTPResponse对象。我们需要read()响应字节,然后decode()这些字节到字符串,如下所示:

import json
import urllib.request, urllib.error, urllib.parse

Name = 'BagFullOfHoles' #Random player
Platform = 'xone'#pc, xbox, xone, ps4, ps3

url = 'http://api.bfhstats.com/api/playerInfo?plat=' + Platform + '&name=' + Name
json_obj = urllib.request.urlopen(url)
string = json_obj.read().decode('utf-8')
json_obj = json.loads(string)
print (json_obj)

答案 1 :(得分:1)

如您所知,Python 3具有单独的bytesstr类型。从以二进制模式打开的文件中读取将返回bytes个对象。

json.load()函数仅适用于在文本模式下打开的文件(和类文件对象)(与二进制模式相反)。似乎urllib.request.urlopen()将以二进制模式返回类似文件。

不要使用json.load(),而是考虑从HTTPResponse对象中读取并解码,然后传递给json.loads(),如下所示:

with urllib.request.urlopen(url) as f:
    json_str = f.read().decode()
obj = json.loads(json_str)

或者,您可能希望调查requests module