Loading a JSON object in Python using urllib.request and json modules

I'm having trouble getting json and urllib.request modules to 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 I run the script through the command line, the error I get is " TypeError: the JSON object should be str, not" bytes " ". I am new to Python, so this is most likely a very simple solution. Appreciate any help here.

+5
source share
1 answer

Besides forgetting about decryption, you can only read the answer once. .read() calling .read() already, the second call returns an empty string.

Call .read() only once and decode the data into a string:

 data = webURL.read() print(data) encoding = webURL.info().get_content_charset('utf-8') JSON_object = json.loads(data.decode(encoding)) 

response.info().get_content_charset() call tells you which characters the server that is using is using.

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}} 
+12
source

Source: https://habr.com/ru/post/1232342/


All Articles