Beiträge von Herr_Berg im Thema „[Python 3] Wetterdaten mit beautiful soup auslesen und auf dem Desktop platzieren“
-
-
-
-
Hallo zalso,
danke fürs Kommentieren und verbessern!
Danke für's Teilen. Wenn ich darf, möchte ich ein paar Anmerkungen machen, ich nehme an, Du hast es auch zur Diskussion hier hinein gestellt, Du darfst die Anmerkungen natürlich ebenso gern ignorieren.
Ok.
Gibt es wohl einen Weg, den String direkt auf den Desktop zu schreiben, anstatt den Umweg über eine Bilddatei zu nehmen?
-
Auf der Seite bergfex.at stehen normalerweise die besten Wetterdaten für meinen Wohnort. Die gewünschten Informationen haben die folgende Form im HTML-Code:
<div class="tmax">-3°C </div> (Maximaltemperatur)
<div class="tmin">-8°C </div> (Minimaltemperatur)
<div class="rrr rrr0"> </div> (Niederschlag)
Variante 1: Datei auf dem Desktop
Beautiful Soup liest diese Daten aus. Mit ImageDraw kann ich die Daten in eine transparente Bilddatei namens canva.png (990 x 180 Pixel) schreiben. Die veränderte Datei speichere ich unter dem Namen Wetter.png auf dem Desktop ab.
(Damit das optische Erscheinungsbild nicht durch den Dateinamen gestört wird, habe ich die Schriftgröße des Labels mit dem Dateinamen auf 0 px gesetzt. Ich verwende die Gnome-Erweiterung Desktop Icons NG. Die CSS-Datei, wo man das einstellen kann, liegt bei mir im Ordner "/home/fritz/.local/share/gnome-shell/extensions/ding@http://rastersoft.com/app/".)
Python
Alles anzeigenfrom PIL import Image, ImageFont, ImageDraw import requests from bs4 import BeautifulSoup import os from datetime import datetime dateipfad = '/home/fritz/Schreibtisch/Wetter.png' # Eine alte Version der Bilddatei entfernen, falls sie existiert if os.path.exists(dateipfad): os.remove(dateipfad) # URL der Webseite url = 'https://www.bergfex.at/leogang/wetter' # HTTP GET-Anfrage an die Webseite senden response = requests.get(url) ausgabe = "" # Überprüfen, ob die Anfrage erfolgreich war (Status Code 200) if response.status_code == 200: # HTML-Inhalt der Seite extrahieren html_content = response.content # BeautifulSoup initialisieren, um die Daten zu analysieren soup = BeautifulSoup(html_content, 'html.parser') # Die gewünschten Daten anhand der Klassen extrahieren tmax_tag = soup.find(class_='tmax') tmin_tag = soup.find(class_='tmin') rrr_tag = soup.find(class_='rrr rrr0') # Überprüfen, ob die Elemente gefunden wurden, bevor auf ihre Inhalte zugegriffen wird if tmin_tag: tmin_data = tmin_tag.text.strip() ausgabe += tmin_data ausgabe += " " if tmax_tag: tmax_data = tmax_tag.text.strip() ausgabe += tmax_data ausgabe += " " if rrr_tag: rrr_data = rrr_tag.text.strip() ausgabe += rrr_data else: print("Fehler beim Abrufen der Webseite. Status Code:", response.status_code) #Die Wetterdaten zur Dokumentation mit Datum abspeichern now = datetime.now() tag = now.strftime("%d") monat = now.strftime("%m") jahr = now.strftime("%Y") zeit = tag + ". " + monat + ". " + jahr + ": " eintrag = zeit + " " + ausgabe + "\n" with open("/home/fritz/wetterdaten.txt", "a") as logfile: logfile.write(eintrag) # Das Image-Objekt erstellen with Image.open("/home/fritz/Skripte/canvas.png") as image: draw = ImageDraw.Draw(image) # Schriftgröße font = ImageFont.truetype('/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 100) # Den Text zeichnen draw.text((5, 5), ausgabe, font = font, align ="left") # Das Bild abspeichern image.save('/home/fritz/Schreibtisch/Wetter.png')
Variante 2: Die Wetterdaten direkt über den Desktop schreiben
Die Daten werden wieder mit Beautiful Soup gelesen und dann direkt über den Desktop geschrieben, allerdings nur solange das Skript läuft.
Python
Alles anzeigenimport gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk import requests from bs4 import BeautifulSoup # URL der Webseite url = 'https://www.bergfex.at/leogang/wetter' # HTTP GET-Anfrage an die Webseite senden response = requests.get(url) ausgabe = "" # Überprüfen, ob die Anfrage erfolgreich war (Status Code 200) if response.status_code == 200: # HTML-Inhalt der Seite extrahieren html_content = response.content # BeautifulSoup initialisieren, um die Daten zu analysieren soup = BeautifulSoup(html_content, 'html.parser') # Die gewünschten Daten anhand der Klassen extrahieren tmax_tag = soup.find(class_='tmax') tmin_tag = soup.find(class_='tmin') rrr_tag = soup.find(class_='rrr rrr0') # Überprüfen, ob die Elemente gefunden wurden, bevor auf ihre Inhalte zugegriffen wird if tmin_tag: tmin_data = tmin_tag.text.strip() ausgabe += tmin_data ausgabe += " " if tmax_tag: tmax_data = tmax_tag.text.strip() ausgabe += tmax_data ausgabe += " " if rrr_tag: rrr_data = rrr_tag.text.strip() ausgabe += rrr_data else: print("Fehler beim Abrufen der Webseite. Status Code:", response.status_code) def draw_text(window, context): context.set_source_rgb(1, 1, 1) # Textfarbe Weiß context.set_font_size(20) context.move_to(20, 60) # Position des Textes context.show_text(ausgabe) def main(): win = Gtk.Window() win.set_type_hint(Gdk.WindowTypeHint.DESKTOP) win.set_skip_taskbar_hint(True) win.set_skip_pager_hint(True) win.set_app_paintable(True) win.connect('draw', draw_text) screen = win.get_screen() visual = screen.get_rgba_visual() if visual and screen.is_composited(): win.set_visual(visual) win.show_all() Gtk.main() if __name__ == "__main__": main()