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

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)

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

最近使用了2to3.py,当我试图修复它时,出现了这个错误或其他错误。有没有人有任何指针?


1
可能是重复的问题:Python JSON解码错误TypeError: can't use a string pattern on a bytes-like object。正如第一个答案所述,_"在Python 3中,您需要将urllib.request.urlopen()返回的bytes解码为Unicode字符串"_。 - Simon MᶜKenzie
2个回答

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有独立的bytes和str类型,从二进制模式打开的文件读取会返回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)

或者,您可能希望调查请求模块


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接