【问题标题】:Issue recieving JSON with urllib.request使用 urllib.request 接收 JSON 的问题
【发布时间】:2015-09-18 18:49:32
【问题描述】:

我一直在使用几个 Web API,但这个让我感到困惑。我不知道我出了什么问题。

此代码适用于一个 api,但不适用于这个。

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)

给了

TypeError: the JSON object must be str, not 'bytes'

以及我在此处的其他类似主题中发现的任何其他组合

我不记得以前遇到过这个问题,我确定我错过了一些东西,但我看不到什么。

【问题讨论】:

  • 有一点需要注意,当 urllib 在 https URI 上遇到“无效”的 ssl 证书时往往会遇到困难。如果没有正确的标志,它会默默地失败。
  • 确定你从你发布的代码中得到了UnicodeEncodeError吗?我希望Unicode Decode Error 例外。请为您的错误发布完整回溯,但我很确定您的代码有效,但您尝试打印结果。
  • ^ 好点,我会调查的。虽然如果我用浏览器打开 url,它会下载 json 文件并毫无问题地打开它。
  • @MartijnPieters 啊,不错,这个错误实际上来自下一个函数中的打印语句(仅用于在我写作时进行测试)我想我必须先对它做些什么才能显示数据?

标签: python json python-3.x


【解决方案1】:

您的初始尝试已经正确。如果不是,您会收到解码错误。

相反,您遇到了 encoding 错误,从 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

在原始响应中传递的最后一次尝试,没有解码数据。

【讨论】:

  • 当使用 "obj = json.load(response.read().decode("utf-8"))" 我得到一个错误 AttributeError: 'str' object has no attribute 'read',我想,因为我的第一次尝试与其他 API 一起工作,我想我会找到解决这个问题的方法。感谢您的信息
【解决方案2】:
response = urllib.request.urlopen(self.query_base).read()
obj = json.loads(response)
return obj

这段代码应该可以工作。 json.load 正在寻找从文件流中读取。 json.loads 是您从字符串中读取 JSON 时想要的。

【讨论】:

  • 我确实尝试过,但一直收到“TypeError: JSON object must be str, not 'bytes'”
【解决方案3】:

好的,以防万一有人遇到此问题并稍后阅读此主题

response = urllib.request.urlopen(self.query_base)
reader = codecs.getreader("utf-8")
obj = json.load(reader(response))
return ascii(obj)

工作正常。

感谢 Martijn Pieters

【讨论】:

    猜你喜欢
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多