我一直在使用几个Web API,但这个让我感到困惑。我无法解决我的错误。
此代码适用于一个api,但不适用于此。
col-md-*
这给了我以下错误
response = urllib.request.urlopen(self.query_base)
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
return obj
我试过了:
UnicodeEncodeError: 'charmap' codec can't encode character '\U0001f602' in position 4096: character maps to <undefined>
给出:
response = urllib.request.urlopen(self.query_base)
obj = json.load(response.decode("utf-8"))
return obj
和
AttributeError: 'HTTPResponse' object has no attribute 'decode'
给出了
response = urllib.request.urlopen(self.query_base).read()
obj = json.load(response)
return obj
和
AttributeError: 'bytes' object has no attribute 'read'
给出了
response = urllib.request.urlopen(self.query_base)
obj = json.load(response)
以及我在其他类似线程中找到的其他东西的组合
我以前不记得遇到过这个问题,我肯定错过了一些东西,但我看不清楚。
答案 0 :(得分:0)
您的初始尝试已经正确。如果不是,则会出现解码错误。
相反,您有编码错误,从Unicode转回字节。这通常是由您使用print()
或尝试将数据写入文件对象引起的。打印时,这通常是由您的控制台无法处理输出引起的。例如,请参阅python3 print unicode to windows xp console encode cp437。
您的第二次尝试失败,因为您没有阅读回复,然后使用json.loads()
(因为您现在传递了一个字符串):
response = urllib.request.urlopen(self.query_base)
obj = json.loads(response.read().decode("utf-8"))
# ^ ^^^^^^^
return obj
您的第3次尝试确实使用了.read()
,但您忘记解码该时间,并且再次没有使用json.loads()
:
response = urllib.request.urlopen(self.query_base).read()
# you didn't forget this ^^^^^^^
obj = json.loads(response.decode('utf-8'))
# ^ ^^^^^^^^^^^^^^^^
return obj
最后一次尝试在原始响应中传递,而不解码数据。
答案 1 :(得分:0)
response = urllib.request.urlopen(self.query_base).read()
obj = json.loads(response)
return obj
此代码应该有效。 json.load
希望从文件流中读取。从字符串中读取JSON时,您需要json.loads
。
答案 2 :(得分:0)
response = urllib.request.urlopen(self.query_base)
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
return ascii(obj)
工作正常。
感谢Martijn Pieters