2015-09-26 11 views
5

Mam problemy z łączeniem modułów "json" i "urllib.request" w prostym teście skryptu Python. Korzystanie z Pythona 3.5 i oto kod:Ładowanie obiektu JSON w języku Python za pomocą modułów urllib.request i json

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 

Po uruchomieniu skryptu za pomocą linii poleceń błąd jestem coraz to „TypeError: obiekt JSON należy STR, a nie«bajty»”. Jestem nowy w Pythonie, więc najprawdopodobniej jest to bardzo łatwe rozwiązanie. Doceń każdą pomoc tutaj.

Odpowiedz

11

Oprócz zapomnienia dekodowania można odczytać tylko odpowiedź raz. Po wywołaniu .read() już drugie połączenie zwraca pusty ciąg.

połączeń .read() tylko raz, a dekodowania dane na łańcuch:

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 mówi, co myśli CharacterSet serwer jest używany.

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}} 
+0

Dzięki Grono, działa dobrze teraz! –

Powiązane problemy