Wetterdaten über XML

Raspberry Pi

Hier zeige ich euch wie ihr Wetterdaten von Yahoo abrufen könnt und diese mittels eines Python-Programms weiter verarbeitet. Dadurch könnt ihr euch z.B. das aktuelle Wetter ausgeben lassen, es ausdrucken, auf Websites anzeigen etc.

-> Was ist eine XML-Datei?:

Eine XML-Datei ist eine Datei, wo Daten in einer hierarchischen Struktur abgelegt sind.
Dadurch ist es möglich Daten plattformunabhängig über das Internet oder andere Computersysteme auszutauschen.
In einer XML-Datei sind die Daten als Klartext hinterlegt, was soviel heißt wie das, laut Definition, kein Binärcode etc. in der Datei vorkommen muss.
Somit kann eine XML Datei auch von einem Menschen gelesen werden.
Eine XML-Datei besteht in seiner Grundform aus mind. einer Entität und mind. einem Element.
Den Elementen können anschließend noch Attribute hinzugefügt werden.
Ein sehr schönes Beispiel für eine XML-Datei findet man auf Wikipedia:

Wikipedia XML
Dabei ist <quiz></quiz> die Entität, sprich das Objekt wo die Informationen drin gespeichert sind.
Die beiden Tags <question> und <answer> sind zwei Elemente der Entität quiz.
Der Text der zwischen den beiden Tags steht (also z.B. zwischen <question> und </question>) ist der Dateninhalt.
Und genau so eine Datei mache ich mir bei meinem „Wetterbericht“ zu nutze.
Jetzt kann man sich die Frage stellen: „Woher weiß ich wie die XML-Datei einer Website aussieht?“
Nun dafür habe ich am Seitenende ein Programm hochgeladen, welches die URL einer beliebigen, im Programm gespeicherten XML-Datei öffnet, sie einließt und in der Konsole ausgibt.
Mittels

kann die Ausgabe anschließend in eine Textdatei namens XML-Aufbau.txt umgeleitet werden.
Dann weiß man genau wie das XML-Dokument der angegebenen Seite aussieht.

-> Das Python Programm:

So wie arbeitet das Wetterprogramm nun?
Als erstes wird mittels der Zeile

die angegebene URL geöffnet, ausgelesen und der Inhalt in der Variable „Baum“ gespeichert.
Die URL ist dabei die standortbezogene URL für die Wetterdaten und der darin enthaltene Zahlencode ist dem Wohnort anzupassen!
Um den Zahlencode rauszufinden geht ihr auf die Website von Yahoo

-> Yahoo Wetter

und anschließend gebt ihr in dieses Feld

Wetter_XML(1)

eure Postleitzahl ein.
Mit einem Klick auf Go werdet ihr weiter geleitet und dort seht ihr das aktuelle Wetter für eure Stadt.
In der URL-Leiste erscheint dann der benötigte Zahlencode:

Wetter_XML(2)

Diesen Zahlencode müsst ihr in das Python Programm übertragen.
Nachdem das Programm alle Daten des XML-Dokuments eingelesen hat, wandelt es diese Daten mit Hilfe der Zeile

für die interne Weiterverarbeitung in eine Baumstruktur um.
Anschließend wird eine Referenz auf diesen Baum erzeugt, sprich der Baum ist unter dem Namen Baum verfügbar.
Als erstes möchte ich wissen um welchen Ort es sich handelt.
Wenn man sich die XML-Datei mal genauer anschaut, sieht man dort folgende Zeile:

Das Element, wo die Standortdaten gespeichert sind, heißt yweather:location.
Bei city, region und country handelt es sich um Attribute, denen ein bestimmter Wert zugeordnet wurde.
Um an die Daten zu gelangen suche ich erst nach einem Element mit dem Namen yweather:location:

Der Zusatz [0] gibt an, dass ich nach dem ersten Element mit dem Namen suche.
Manche Elemente (z.B. description) sind doppelt vorhanden. Um dann das zweite Element zu suchen schreibt man [1] anstatt [0].
Als Rückgabewert speicher ich eine Referenz auf das Element.
Diese Referenz ist ab sofort unter dem Namen Ort abrufbar.
Nun kann ich mittels

auf die Attribute city und country zugreifen und den Wert in einer Variable speichern.
Dabei ist der rot markierte Teil die Referenz auf das Element!
So kann das XML-Dokument Stück für Stück ausgelesen werden um alle wichtigen Daten zu erhalten.
Eine fertige Wetterausgabe für Monheim sieht dann z.B. so aus:

Wetter_XML(3)

Das komplette Skript gibt es auch wieder zum download.
Ihr könnt es dann natürlich problemlos euren Bedürfnissen anpassen :)

 

Dokumentation:

 

-> Zurück zu den Basteleien mit dem Raspberry Pi

15 thoughts on “Wetterdaten über XML
  1. hi daniel,
    coole python-anwendung! eine kleine anmerkung: latitude (Geo_Lat) ist der geographische Breitengrad, longitude (Geo_Long) der Längengrad….
    gruß henner

  2. Hallo Kampi, das ist eine tolle Website – weiter so!

    Ein kleiner Kommentar zur RSS Abfrage bei Yahoo:
    Du kannst Dir das Umrechnen von F in C für die Temperatur sparen, wenn Du im Python Script gleich in Celsius abfragst. Das geht mit ‚&u=c‘ hinter der Abfrage. (siehe: http://developer.yahoo.com/weather/).

    Viele Grüße,
    Rudi

  3. Hallo Kampi,

    tolles Script, gefällt mir super gut.
    Aber kennst Du eine Möglichkeit die „print“ Ausgaben von dem Script auf einer php-Seite des Webservers auszugeben?
    Das wäre ne coole Sache.

    Gruß Morty

  4. Hi Daniel,
    tolle Sache hier! Der Code für die Yahoodaten ist genau das was ich gesucht habe.
    Ich habe aber ein Problem beim Umsetzen. Code will nur in Python 2.7 starten, in Python 3 bringt er immer Fehler. Dachte erst es liegt an ‚ und “ aber das hat nichts geholfen. Kannst du mir dahingehend vielleicht helfen? Mein kompletter Code ist in Python 3 und da wollte ich die Wetterdaten gerne einbinden.

    Viele Grüße
    Christian

  5. Was muss ich tun, wenn ich jetzt die aktuelle Temperatur nicht nur ausgeben möchte, sondern sie auch noch in einer .txt auf meinem Webserver (auch dem Pi) speichern möchte?

  6. Hi,
    was müsste ich tun, damit die Wetterdaten in einem bestimmten Intervall z.B jede Minute automatisch neu abgefragt werden (Kein Cronjob/Änderung in der Python Datei)?
    Vielen Dank im Voraus!

      • Ich möchte das Skript extrahieren und in eine existierende Python Datei implementieren, deswegen soll nur dieser „Wetterteil“ regelmäßig aktualisiert werden.

        Bin mir nicht sicher, ob der Befehl: „updateRate = “ funktionieren würde.

  7. Hi, super Idee.

    Hast Du mal versucht das Wetter für die nächsten 3 oder 4 Tage auszulesen?
    Das steht ja in der Yahoo Weather XML drinnen.

    Dazu habe ich den Range von 2 auf 4 erhöht.
    Dann läuft das Script aber auf einen Fehler.

    Hast Du dazu eventuell eine Idee?

    Danke

    Gruß

    Marcel

    # Daten in einer Liste speichern
    for Counter in range(4):

    # Wetterdaten fuer die beiden Tage einlesen
    # Daten einlesen
    Future = Baum.getElementsByTagName(‚yweather:forecast‘)[Counter]

    # Daten verarbeiten
    Wetter[Counter][0] = Future.attributes[„day“].value
    Wetter[Counter][1] = Future.attributes[„date“].value
    Wetter[Counter][2] = float(Future.attributes[„low“].value)
    Wetter[Counter][3] = float(Future.attributes[„high“].value)
    Wetter[Counter][4] = Future.attributes[„text“].value

    • Hallo Marcel,

      ne das habe ich noch nicht probiert.
      Was bekommst du den für einen Fehler?
      So aus dem Stehgreif weiß ich nicht was da nicht läuft, aber ich habe auch das XML-File gerade nicht zur Hand :)
      Ich kann die Tage mal gucken was geändert werden muss.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.