问题
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: can't use a string pattern on a bytes-like object
Just recently used 2to3.py and this error or others come up when I try to fix it . Anyone with any pointers?
回答1:
The json_obj = urllib.request.urlopen(url) returns an HTTPResponse object. We need to read() the response bytes in, and then decode() those bytes to a string as follows:
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)
回答2:
Python 3, as you may know, has separate bytes and str types. Reading from a file opened in binary mode will return bytes objects.
The json.load() function only works with files (and file-like objects) opened in text mode (as opposed to binary mode). It appears that urllib.request.urlopen() will return a file-like in binary mode.
Instead of using json.load(), consider reading from the HTTPResponse object and decoding, then passing to json.loads(), like this:
with urllib.request.urlopen(url) as f:
json_str = f.read().decode()
obj = json.loads(json_str)
Alternatively, you may wish to investigate the requests module.
来源:https://stackoverflow.com/questions/29663749/typeerror-cant-use-a-string-pattern-on-a-bytes-like-object-api