问题描述
我在一个简单的 Python 脚本测试中使模块 'json' 和 'urllib.request' 一起工作时遇到问题.使用 Python 3.5,代码如下:
导入json导入 urllib.requesturlData = "http://api.openweathermap.org/data/2.5/weather?q=Boras,SE"webURL = urllib.request.urlopen(urlData)打印(webURL.read())JSON_object = json.loads(webURL.read()) #这是行不通的
当通过命令行运行脚本时,我得到的错误是TypeError:JSON 对象必须是 str,而不是 'bytes'".我是 Python 的新手,所以很可能有一个非常简单的解决方案.感谢这里的任何帮助.
除了忘记解码,你只能读取响应一次.已经调用了 .read()
,第二次调用返回一个空字符串.
调用 .read()
一次,然后将数据解码成字符串:
data = webURL.read()打印(数据)encoding = webURL.info().get_content_charset('utf-8')JSON_object = json.loads(data.decode(encoding))
response.info().get_content_charset()
调用 告诉你服务器认为使用了什么字符集.
演示:
>>>导入json>>>导入 urllib.request>>>urlData = "http://api.openweathermap.org/data/2.5/weather?q=Boras,SE">>>webURL = urllib.request.urlopen(urlData)>>>数据 = webURL.read()>>>encoding = webURL.info().get_content_charset('utf-8')>>>json.loads(data.decode(encoding)){'坐标':{'纬度':57.72,'经度':12.94},'能见度':10000,'名称':'博拉斯','主要':{'压力':1021,'湿度':71,'temp_min': 285.15, 'temp': 286.39, 'temp_max': 288.15}, 'id': 2720501, 'weather': [{'id': 802, 'description': '散云', 'icon':'03d', 'main': 'Clouds'}], 'wind': {'speed': 5.1, 'deg': 260}, 'sys': {'type': 1, 'country': 'SE', 'sunrise': 1443243685, 'id': 5384, 'message': 0.0132, 'sunset': 1443286590}, 'dt': 1443257400, 'cod': 200,'station'sbase{'全部':40}}I am having problems making the modules 'json' and 'urllib.request' work together in a simple Python script test. Using Python 3.5 and here is the code:
import json
import urllib.request
urlData = "http://api.openweathermap.org/data/2.5/weather?q=Boras,SE"
webURL = urllib.request.urlopen(urlData)
print(webURL.read())
JSON_object = json.loads(webURL.read()) #this is the line that doesn't work
When running script through command line the error I am getting is "TypeError:the JSON object must be str, not 'bytes'". I am new to Python so there is most likely a very easy solution to is. Appreciate any help here.
Apart from forgetting to decode, you can only read the response once. Having called .read()
already, the second call returns an empty string.
Call .read()
just once, and decode the data to a string:
data = webURL.read()
print(data)
encoding = webURL.info().get_content_charset('utf-8')
JSON_object = json.loads(data.decode(encoding))
The response.info().get_content_charset()
call tells you what characterset the server thinks is used.
Demo:
>>> import json
>>> import urllib.request
>>> urlData = "http://api.openweathermap.org/data/2.5/weather?q=Boras,SE"
>>> webURL = urllib.request.urlopen(urlData)
>>> data = webURL.read()
>>> encoding = webURL.info().get_content_charset('utf-8')
>>> json.loads(data.decode(encoding))
{'coord': {'lat': 57.72, 'lon': 12.94}, 'visibility': 10000, 'name': 'Boras', 'main': {'pressure': 1021, 'humidity': 71, 'temp_min': 285.15, 'temp': 286.39, 'temp_max': 288.15}, 'id': 2720501, 'weather': [{'id': 802, 'description': 'scattered clouds', 'icon': '03d', 'main': 'Clouds'}], 'wind': {'speed': 5.1, 'deg': 260}, 'sys': {'type': 1, 'country': 'SE', 'sunrise': 1443243685, 'id': 5384, 'message': 0.0132, 'sunset': 1443286590}, 'dt': 1443257400, 'cod': 200, 'base': 'stations', 'clouds': {'all': 40}}
这篇关于使用 urllib.request 和 json 模块在 Python 中加载 JSON 对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!