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}}
source share