Seite 1 von 1

dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 11:54
von Westdeutschland
Hi, das ist mein Code:

Code: Alles auswählen

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

Lehrer = {
  .... # geloescht aus Datenschutzgruenden
}
def extrahieren_lehrer_spalte():
    # Konfigurieren von Selenium
    options = Options()
    options.add_argument("--headless")  # Ausführen im Headless-Modus, um den Browser nicht anzuzeigen
    service = Service('path/to/chromedriver')  # Pfad zum ChromeDriver anpassen
    driver = webdriver.Chrome(service=service, options=options)

    url = 'https://www.jkg-wds.de/Schulintern/Vertretungsplan/EXPORT%20Stundenplan%20SuS%20heute/subst_001.htm'

    driver.get(url)
    time.sleep(2)  # Warten, bis die Seite vollständig geladen ist

    soup = BeautifulSoup(driver.page_source, 'html.parser')

    rows = soup.find('table', {'class': 'mon_list'}).find_all('tr')

    Vertretungsplan_list = []

    thomas = []

    # Extrahiere die Spaltenüberschriften
    for headline in rows[0].find_all('th'):
        thomas.append(headline.text)

    # Durchlaufe alle Zeilen außer der ersten (Überschriftenzeile)
    for row in rows[1:]:
        dic = {}
        for i, cell in enumerate(row.find_all('td')):
            dic[thomas[i]] = cell.text.strip()
            
            if cell.find('s'):  # Überprüfung auf durchgestrichenes Format
                dic[thomas[i]] = dic[thomas[i]].replace("<s>", "").replace("</s>", "")  # Entfernen der Markierung
                
                # Entfernen des Texts hinter den Pfeilen
                arrow_index = dic[thomas[i]].find('→')
                if arrow_index != -1:
                    dic[thomas[i]] = dic[thomas[i]][:arrow_index]
            else:
                dic[thomas[i]] = ""  # Nicht durchgestrichene Lehrernamen entfernen
        
        if dic["(Lehrer)"] != "":
            Vertretungsplan_list.append(dic)

    lehrer_spalte = []

    # Extrahiere die Lehrernamen
    for eintrag in Vertretungsplan_list:
        lehrer = eintrag["(Lehrer)"]
        lehrer_spalte.append(lehrer)

    # Browser und Treiber schließen
    driver.quit()

    return lehrer_spalte

# Funktion aufrufen und das Ergebnis speichern
result = extrahieren_lehrer_spalte()

# Das Ergebnis ausgeben
print(result)

def update_fehlstunden(lehrer_list):
    global Lehrer
    for lehrer in lehrer_list:
        if lehrer in Lehrer:
            Lehrer[lehrer]["Fehlstunden"] += 1

update_fehlstunden(result)

print(Lehrer)



Mein Problem ist, dass das dictionary im Code nicht Aktualisiert wird, wenn ich den code ausführe es wird zwar richtig ausgegeben aber das dictionary wird nicht aktualisiert.

Es würde mich sehr freuen, wenn ihr mir helfen könntet und hoffe, dass das nicht unter "Schulaufgaben machen" fällt.

Re: dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 12:20
von Sirius3
Bei dieser Seite ist selenium nicht nötig. Den Inhalt per requests.get abzurufen ist einfacher und robuster. Variablennamen werden komplett klein geschrieben. Sie enthalten keine kryptischen Abkürzungen und keine Typen im Namen. thomas statt table_header ist so eine kryptische Abkürzungen. Statt dws Index i würde man zip benutzen.
Vergiss gleich wieder, dass es global überhaupt gibt, globale Variablen benutzt man nicht.
Wenn ich dich richtig verstehe, willst Du das Wörterbuch mit den Lehrern gar nicht im Code stehen haben, sondern in einer extra Datei, die Du lesen und schreiben kannst. Als Format bietet sich hier z.B. csv an.

Re: dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 12:23
von __deets__
Hast du das Einverstaendnis der gelisteten Lehrer, dass du ihre Klarnamen und Email ins Netz kippen darfst?

Was das Problem angeht: erwartest du, dass die Aenderung der Datenstruktur zur Laufzeit eine Auswirkung auf den Programmtext hat? Das ist (dankenswerterweise) nicht so. Wenn du nicht jedes mal die Daten abgreifen willst, musst du sie in einer extra Datei zwischenspeichern, zB einer CSV-Datei.

Re: dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 12:29
von Westdeutschland
wie kann ich das hier schließen um dann nochmal ein neues Thema aufzumachen

Re: dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 12:31
von Westdeutschland
Ich habe nicht an den Datenschutz gedacht, wie kann ich meinen Ursprünglichen Code löschen, mir wird da nicht zum bearbeiten angezeigt

Re: dictionary aktualisieren

Verfasst: Samstag 20. Mai 2023, 12:34
von __deets__
Ich habe den Code bearbeitet, und deine Kopie geloescht. Die Bearbeitung ist nach 15m verboten, um naechtraegliches Verfaelschen zu verhindern. Das ist in einem solchen Fall hier natuerlich kontra-produktiv, aber in der Summe besser. Dafuer sind dann ja Moderatoren wie ich da. Du kannst dazu die Melden-Funktion benutzen, dann ist das besser sichtbar fuer uns.