2015-04-16 35 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

相關問題