openweathermap json lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hi2Helmi
User
Beiträge: 3
Registriert: Samstag 21. Juni 2014, 16:53

Hallo,
ich bin noch Neuling, was Python angeht und habe schon viel getestet.
Jetzt habe ich allerdings ein kleines Problem, mit dem ich nicht klar komme.

Ich möchte gerne die Daten aus dem JSON von OpenWeatherMap auslesen und hänge schon am Anfang.

Code: Alles auswählen

from urllib.request import urlopen
import json

json_string = urlopen("http://api.openweathermap.org/data/2.5/weather?id=6556947&units=metric&lang=de").read()

test=json.loads(json_string)
print(test['coord']['lon'])
Und zack bekomme ich einen Fehler ausgegeben, mit dem ich nicht viel anfangen kann.

Code: Alles auswählen

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "D:\Cloud\Cloud Station FH\Raspi\Python\MeinWetter\jsontest.py", line 6, in <module>
    test=json.loads(json_string)
  File "C:\Python34\lib\json\__init__.py", line 312, in loads
    s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
>>> 
Mit der Beschreibung in der Hilfe kann ich nicht viel anfangen, da mein Englisch zu schlecht ist.
Deshalb Frage ich die Profis hier einmal.

Hi2Helmi
BlackJack

@Hi2Helmi: `json_string` ist vom Typ `bytes`, müsste aber damit der Wert von `json.loads()` verarbeitet werden kann vom Typ `str` sein. Du müsstest die Bytes also vorher zu einer Zeichenkette dekodieren mit der entsprechenden Methode auf dem `bytes`-Exemplar und der Angabe der Kodierung die verwendet werden soll. Bei JSON ist das in der Regel UTF-8.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hi2Helmi: der Fehler sagt Dir, dass json.loads einen Unicode-String erwartet, HTTPResponse.read aber nur Bytes liefert. Um zwischen Bytes und Strings zu konvertieren braucht man ein Encoding, das sagt, wie man Bytes in Zeichen umwandeln muß. Dieses Encoding wird normalerweise vom Server mitgeliefert und steht im Header im Content-Type. Da das Auslesen und interpretieren recht aufwändig ist, gibt es schon fertige Pakete, die das für einen erledigen. Hier sei "requests" empfohlen, das auch gleich die json-Ausgabe liefert:

Code: Alles auswählen

import requests

response = requests.get("http://api.openweathermap.org/data/2.5/weather", params={"id":6556947, "units":"metric", "lang":"de"})

weather = response.json()
print(weather['coord']['lon'])
Hi2Helmi
User
Beiträge: 3
Registriert: Samstag 21. Juni 2014, 16:53

Vielen Dank,

das mit dem "requests" hatte ich auch irgendwo gelesen, konnte mir aber keinen Reim drauf machen und habe es nicht probiert.

Und jetzt habe ich das Problem, dass requests nicht installiert ist, oder nicht gefunden wird.

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Cloud\Cloud Station FH\Raspi\Python\MeinWetter\jsontest.py", line 3, in <module>
    import requests
ImportError: No module named 'requests'
Hi2Helmi
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hi2Helmi: ja, request muß extra installiert werden.
Hi2Helmi
User
Beiträge: 3
Registriert: Samstag 21. Juni 2014, 16:53

Ich habe jetzt requests mit:

Code: Alles auswählen

py -3.4 -m pip install requests
installiert und es funktioniert.
Danke für die Hilfe jetzt kann ich endlich weiter machen.
Antworten