Wetterdaten einlesen

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
Makke1207
User
Beiträge: 1
Registriert: Dienstag 24. September 2019, 19:45

Hallo,
Python Neuling hier!

Ich würde gerne Wetterdaten abrufen und mittels Python weiter verarbeiten und mir anzeigen lassen.
Daher habe ich in Google gestöbert und bin über diesen Code gestolpert. (Code stammt aus dem Jahr 2014).
Ich besitze Python 3.7 und es kommt zu einigen Problemen, wenn ich den Code in Notepad ++ übertrage und
mit der Eingabeaufforderung den Code starten will.

1. urlopen wird als Fehler angezeigt: module 'urllib' has no attribute 'urlopen'
2. if Richtung <= 0:
^
SyntaxError: invalid syntax <---- wird als Fehler angezeigt

Code: Alles auswählen

# Copyright by Kampis-Elektroecke
# Modified by Julian R.

from xml.dom.minidom import *
import urllib

# Liste fuer den Wetterbericht
# 1. Dimension = heute, 2. Dimension = naechster Tag
# 1. Element = Tag, 2. Element = Datum, 3. = Niedrigste Temperatur, 4. Element = Hoechste Temperatur, 5. Element = Wettersituation
Wetter = [["", "", "", "", ""] , ["", "", "", "", ""]]

# URL oeffnen und XML Daten einlesen
Baum = urllib.urlopen('http://weather.yahooapis.com/forecastrss?w=676288').read()				
# XML Daten parsen und in Baumstruktur anordnen
Baum = parseString(Baum)

# Ort einlesen
Ort = Baum.getElementsByTagName('yweather:location')[0]
Stadt = Ort.attributes["city"].value
Land = Ort.attributes["country"].value

# Datum einlesen
Datum = Baum.getElementsByTagName('lastBuildDate')[0].firstChild.data

# Koordinaten auslesen
Geo_Lat = Baum.getElementsByTagName('geo:lat')[0].firstChild.data
Geo_Long = Baum.getElementsByTagName('geo:long')[0].firstChild.data

# Wetterdaten von heute einlesen
Today = Baum.getElementsByTagName('yweather:condition')[0]

# Wind einlesen
Wind = Baum.getElementsByTagName('yweather:wind')[0]
Richtung = float(Wind.attributes["direction"].value)
Speed = float(Wind.attributes["speed"].value)
Speed = round((Speed*1.609),2)

# Sonnenaufgang einlesen
Sonne = Baum.getElementsByTagName('yweather:astronomy')[0]
Aufgang = Sonne.attributes["sunrise"].value
Untergang = Sonne.attributes["sunset"].value

# Wettertext einlesen
Wetterlage = Today.attributes["text"].value

# Temperatur in Fahrenheit einlesen, umrechnen und runden
Temperatur = float(Today.attributes["temp"].value)
Temperatur = round((Temperatur - 32.0) * (5.0 / 9.0) , 2)

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

# 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

# Umrechnen der Temperatur in Grad Celsius
	Wetter[Counter][2] = round((Wetter[Counter][2] - 32.0) * (5.0 / 9.0) , 2)
	Wetter[Counter][3] = round((Wetter[Counter][3] - 32.0) * (5.0 / 9.0) , 2)

# Umrechung Windrichtung
if Richtung &lt;= 0:
	Windrichtung = "Nord"
	elif Richtung &lt;=45:
		Windrichtung = "Nord-Ost"
	elif Richtung &lt;= 90:
		Windrichtung = "Ost"
	elif Richtung &lt;= 135:
		Windrichtung = "Sued-Ost"
	elif Richtung &lt;= 180:
		Windrichtung = "Sued"
	elif Richtung &lt;= 225:
		Windrichtung = "Sued-West"
	elif Richtung &lt;= 270:
		Windrichtung = "West"
	elif Richtung &lt;= 315:
		Windrichtung = "Nord-Ost"
	else:
		Windrichtung = "Fehler!"

&nbsp;										

&nbsp;   										

# Ausgabe
print ("")
print ("Wetterbericht fuer " + Stadt + " in " + Land)
print ("Datum: " + Datum)
print ("")

print ("Koordinaten")
print ("Breitengrad: " + Geo_Lat)
print ("Laengengrad: " + Geo_Long)
print ("")

print ("Wetter heute")
print ("Temperatur: " + str(Temperatur) + " C Celsius")
print ("Max. Temperatur: " + str(Wetter[0][3]) + " C Celsius")
print ("Min. Temperatur: " + str(Wetter[0][2]) + " C Celsius")
print ("Wettersituation: " + Wetterlage)
print ("")

print "Windsituation"
print "Richtung: " + Windrichtung
print "Geschwindigkeit " + str(Speed) + " km/h"
print ("")

print ("Sonne")
print ("Sonnenaufgang " + Aufgang)
print ("Sonnenuntergang " + Untergang)
print ("")

print ("Wetter am naechsten Tag")
print ("Tag: " + Wetter[1][0])
print ("Datum: " + Wetter[1][1])
print ("Max. Temperatur: " + str(Wetter[1][2]) + " C Celsius")
print ("Min. Temperatur: " + str(Wetter[1][3]) + " C Celsius")
print ("Wetter: " + Wetter[1][4])
print ("")

# Quelle angeben
Quelle = Baum.getElementsByTagName('link')[1].firstChild.data
print ("Alle Daten stammen von " + Quelle)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das muss <= heißen - das ist vermurkst wegen der HTML Seite. Und du benutzt eine neu Version von Python, da hat sich urllib geändert. Hast du nach der Fehlermeldung mal gegoogelt?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt minidom solltest Du ElementTree verwenden. Dann wirst Du auch gezwungen, korrekte Namespaces zu verwenden.
In Python initialisiert man keine Listen mit Dummye dann, wenn sie gebraucht werden.
Variabelnnamen werden klein geschrieben.
Strings stückelt man nicht mit + zusammen, sondern benutzt Formatstrings.
Und zu guterletzt: die URL zum Abfragen des Wetters existiert nicht mehr.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Makke1207: Ich bin gerade etwas verwundert wie Du den 1. Fehler bekommst, weil man das dafür ausführen müsste, was aber wegen dem 2. (SyntaxFehler) gar nicht geht. Da sind auch noch ``&nbsp`` drin, Code der falsch eingerückt ist, und `print` ohne Klammern. Das müsste man auch erst alles beheben.

Zusätzlich zu dem was Sirius3 zu den Listen mit den Dummywerten gesagt hat: Die inneren Listen sollten keine Listen sein. In Listen gehören gleichartige Elemente. Wenn der Index bestimmt was der Wert bedeutet, dann hat man eigentlich Datenobjekte und sollte so etwas wie `collections.namedtuple` verwenden. Dann muss man auch keinen Kommentar schreiben der erklärt was die ”magischen” Indexwerte bedeuten und beim Zugriff auf die Daten ist wesentlich verständlicher was da gemacht wird.

Sternchen-Importe sind Böse™. Hier wird *alles* aus dem `minidom`-Modul importiert um dann genau *eine* Funktion zu verwenden.

Der Name `Baum` wird für zwei ziemlich verschiedene Dinge verwendet: Den Quelltext der Webseite — was eine Sequenz von Bytes ist und kein Baum, und den tatsächlichen Objektbaum nach dem parsen des XML.

Dateiobjekte die man öffnet, sollte man auch wieder schliessen. Das betrifft auch `urlopen()`. Am besten verwendet man dazu die ``with``-Anweisung.

Das runden von Werten sollte man wirklich nur machen wenn man mit den gerundeten Werten weiter rechnen will. Runden für die Ausgabe macht man nicht mit `round()` sondern beim formatieren der Ausgabe mit den entsprechenden Angaben beim Platzhalter.

Wenn man mehrfach Fahrenheitwerte in Celsius umrechnen muss, dann schreibt man die Formel nicht jedes mal hin, sondern definiert sich eine Umrechnungsfunktion.

Insgesamt ist der Code deutlich zu lange um ihn nicht sinnvoll auf Funktionen aufzuteilen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten