2015-04-16 22 views
3
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) 

类型错误:一类字节对象类型错误:无法使用类字节对象的字符串模式,API

就在最近使用2to3.py,这对不能使用字符串模式当我尝试修复它时,出现错误或其他问题。任何人有任何指针?

+0

[Python JSON解码错误TypeError的可能的重复:不能在类似字节的对象上使用字符串模式](http://stackoverflow.com/questions/22359997/python-json-decoding-error-typeerror-倾斜使用的-A-串图案上一个字节样)。正如第一个答案所述,_“在Python 3中,您需要将'urllib.request.urlopen()'的'bytes'返回值解码为一个unicode字符串”_“。 –

回答

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

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

相关问题