TypeError: can't use a string pattern on a bytes-like object, api

TypeError: can't use a string pattern on a bytes-like object, api

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)

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

最近刚用过 2to3.py,当我尝试修复它时出现了这个错误或其他错误。有人有任何指示吗?

json_obj = urllib.request.urlopen(url) returns 一个 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)

Python 3,如您所知,有不同的 bytesstr 类型。从以二进制模式打开的文件读取将 return bytes 个对象。

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

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

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

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