LSF-Funktionen

Diese Seite beschreibt die Funktionen aus hexscrapepy.lsf_scraper. Der Schwerpunkt liegt auf LSF-Systemen: zuerst eine Veranstaltungsliste aufbauen, dann die Detailseiten laden und in einzelne Inhaltsblöcke zerlegen.

Typischer Ablauf

Wenn du nicht mit Einzelparsern arbeiten willst, ist der typische Ablauf sehr einfach:

Mit lsf_scrape_all_semesters() einen kompletten Lauf starten.

Intern erzeugt das Paket zuerst die Basisdaten mit lsf_scrape_base_data(). Danach lädt es die Detailseiten mit lsf_scrape_veranstaltungsdetails(). Die kleineren lsf_extract_*-Funktionen lesen daraus die einzelnen Inhalte.

semester_liste = [
    "Wintersemester 2005/2006",
]

lsf_scraper.scrape_lsf_all_semesters(
    start_url="https://studiport.uni-flensburg.de/qisserver/rds?state=user&type=8&topitem=departments&breadCrumbSource==portal",
    semester_liste=semester_liste,
    output_dir="data/uni_flensburg",
    method="path",
)

Wenn du nur einen Teil des Workflows brauchst:

  • lsf_scrape_base_data() ist für die Veranstaltungsliste zuständig
  • lsf_scrape_veranstaltungsdetails() ergänzt zu vorhandenen URL_Event-Links die Detaildaten
  • lsf_extract_* ist die Gruppe der kleineren Parser für einzelne Bereiche der Detailseite

Rollen der Funktionen

Öffentlich empfohlen

Funktion Rolle Kurzbeschreibung
lsf_scrape_base_data Basisdaten sammelt alle Veranstaltungen eines oder mehrerer Semester und speichert die Ergebnisliste
lsf_scrape_veranstaltungsdetails Detaildaten öffnet vorhandene Veranstaltungs-Links und ergänzt Titel, Termine, Personen, Module und weitere Details
lsf_scrape_all_semesters Wrapper nimmt dir den kompletten Ablauf ab und führt Basislauf und Detail-Scraping nacheinander aus

Modular nutzbar

Funktion Rolle Kurzbeschreibung
lsf_select_semester Navigation stellt im LSF das gewünschte Semester ein und öffnet das Vorlesungsverzeichnis
lsf_extract_veranstaltungstitel Extraktion liest nur den sichtbaren Titel einer Veranstaltung
lsf_extract_grunddaten Extraktion liest die normalen Stammdaten wie Art, Nummer oder Semester aus dem Grunddaten-Block
lsf_extract_termine Extraktion liest die Termin-Tabelle einer Veranstaltung
lsf_extract_dozenten Extraktion liest die Tabelle der durchführenden Dozierenden
lsf_extract_zugeordnete_personen Extraktion liest weitere zugeordnete oder verantwortliche Personen
lsf_extract_studiengaenge Extraktion liest die zugeordneten Studiengänge
lsf_extract_module Extraktion liest die zugeordneten Module
lsf_extract_einrichtung Extraktion liest organisatorische Einheiten oder Einrichtungen
lsf_extract_weitere_angaben Extraktion liest den Sammelblock Weitere Angaben zur Veranstaltung als einzelne Felder
lsf_extract_lerninhalt Extraktion zieht aus den weiteren Angaben nur den Lerninhalt heraus
lsf_extract_kommentar Extraktion zieht aus den weiteren Angaben nur den Kommentar heraus
lsf_fetch_course_html Abruf lädt das rohe HTML einer Detailseite ohne Browser-Automation
lsf_fetch_course_html_expanded Abruf lädt die Detailseite mit Playwright, wenn Inhalte erst nach Klicks sichtbar werden

Intern

Funktion Rolle Kurzbeschreibung
lsf_clean_text Helper räumt Text auf und ersetzt leere Werte durch einen einheitlichen Platzhalter
lsf_normalize_url Helper macht Navigations-URLs vergleichbar, damit Knoten nicht doppelt besucht werden
_scrape_via_path Workflow interner Weg durch die Baumstruktur des Vorlesungsverzeichnisses
_scrape_via_search Workflow interner Weg über die Suchmaske
_find_event_tables Parser erkennt Tabellen, in denen wirklich Veranstaltungen stehen
_parse_event_table Parser liest eine gefundene Veranstaltungstabelle zeilenweise aus
_find_lsf_section_table Parser findet robuste Zieltabellen für einzelne Bereiche einer Detailseite
_needs_expanded_lsf_fetch Steuerung entscheidet, ob eine Detailseite noch einmal mit aufgeklappten Bereichen geladen werden muss
_load_lsf_results_json Resume lädt schon vorhandene Detaildaten für einen Resume-Lauf
_write_lsf_results_json Resume speichert Zwischenstände oder Endergebnisse als JSON
_build_lsf_detail_frame Merge bereitet Detaildaten so auf, dass sie sauber mit den Eingangsdaten zusammengeführt werden können

Referenz

Komplettes Modul

hexscrapepy.lsf_scraper

lsf_clean_text(text)

Bereinige Freitext für Export und Parsing.

Parameters:

Name Type Description Default
text

Roher Text oder None.

required

Returns:

Type Description

Bereinigter String mit normalisiertem Whitespace oder "N.N." bei leerem Input.

lsf_extract_dozenten(soup)

Extrahiert echte Dozenten-Tabellen aus einer LSF-Seite.

Wichtig: Diese Funktion ist bewusst enger gefasst als lsf_extract_zugeordnete_personen. Sie liest nur Tabellen, die tatsächlich als Durchführende Dozenten ausgezeichnet sind. Allgemeine Personenblöcke wie Zugeordnete Person werden hier nicht mehr mit ausgewertet.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile pro Person und den Spalten

DataFrame

'dozierenden_name' und 'dozierenden_rolle'

lsf_extract_einrichtung(soup)

Extrahiert den Einrichtungs-Block als verschachtelte Tabelle.

Anders als bei Studiengänge oder Module sind diese Tabellen oft sehr klein und teils zweispaltig aufgebaut. Deshalb wird hier nicht blind read_html verwendet, sondern die Tabelle zeilenweise in ein kleines DataFrame übersetzt.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile und der Spalte einrichtung.

lsf_extract_grunddaten(soup)

Lese den Block Grunddaten zur Veranstaltung strukturiert aus.

Parameters:

Name Type Description Default
soup BeautifulSoup

Geparster HTML-Baum der Detailseite.

required

Returns:

Type Description
dict

Einzeiliges DataFrame mit den erkannten Grunddaten oder ein leeres

dict

DataFrame, wenn der Block fehlt.

lsf_extract_kommentar(soup)

Extrahiert den Kommentar aus dem Block Weitere Angaben.

Zuerst wird die generische Extraktion über lsf_extract_weitere_angaben versucht. Falls eine Uni stattdessen nur eine einzige kommentierende Zeile ohne saubere Überschrift liefert, gibt es darunter noch einen kleinen Fallback für diesen Sonderfall.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile und einer Spalte 'kommentar'.

lsf_extract_lerninhalt(soup)

Extrahiert Lerninhalte aus dem Block Weitere Angaben.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile und der Spalte lerninhalt.

lsf_extract_module(soup)

Extrahiert den Modul-Block als verschachtelte Tabelle.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns: DataFrame mit einer Zeile und der Spalte module.

lsf_extract_studiengaenge(soup)

Extrahiert den Studiengangs-Block als verschachtelte Tabelle.

Parameters:

Name Type Description Default
soup BeautifulSoup

BeautifulSoup-Objekt der LSF-Seite

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile und der Spalte studiengaenge.

DataFrame

In dieser Zelle liegt wiederum ein DataFrame mit den Originalspalten

DataFrame

der Studiengangstabelle.

lsf_extract_termine(soup)

Lese alle Terminzeilen einer LSF-Detailseite aus.

Parameters:

Name Type Description Default
soup BeautifulSoup

Geparster HTML-Baum der Detailseite.

required

Returns:

Type Description
DataFrame

DataFrame mit einer Zeile pro Termin.

lsf_extract_veranstaltungstitel(soup)

Lese den sichtbaren Veranstaltungstitel aus einer LSF-Detailseite.

Parameters:

Name Type Description Default
soup BeautifulSoup

Geparster HTML-Baum der Detailseite.

required

Returns:

Type Description
DataFrame

Einzeiliges DataFrame mit der Spalte veranstaltungstitel oder ein

DataFrame

leeres DataFrame, wenn kein Titel erkannt wurde.

lsf_extract_weitere_angaben(soup)

Extrahiert alle Felder aus Weitere Angaben zur Veranstaltung.

Die LSF-Ansicht kapselt diesen Bereich teils in auf-/zuklappbare Container (z.B. veranst_slide_inhalt). Für das Parsing ist das unkritisch, solange die Tabelle im HTML enthalten ist. Diese Funktion liest deshalb die Tabellenzeilen generisch aus und liefert eine einzige Zeile mit allen vorhandenen Feldern zurück.

lsf_extract_zugeordnete_personen(soup)

Extrahiert die zugeordneten Personen als verschachtelte Tabelle.

Diese Funktion ist für LSF-Blöcke wie Zugeordnete Person oder Verantwortliche Dozenten gedacht. Das Ergebnis wird bewusst als verschachtelte Tabelle zurückgegeben, damit die Struktur aus dem HTML möglichst erhalten bleibt.

Rückgabespalten der inneren Tabelle: - zugeordnete_person - zustaendigkeit

lsf_fetch_course_html(url, timeout=30)

Lade das rohe HTML einer LSF-Veranstaltungsseite per HTTP.

Parameters:

Name Type Description Default
url str

URL der Veranstaltungsdetailseite.

required
timeout int

Timeout des HTTP-Requests in Sekunden.

30

Returns:

Type Description
str

Rohes HTML der Antwort als String.

lsf_fetch_course_html_expanded(url, timeout_ms=30000)

Lade eine LSF-Detailseite mit aufgeklappten Toggle-Bereichen.

Einige LSF-Installationen rendern Bereiche wie Inhalt oder Zugeordnete Person erst nach einem Klick auf veranst_toggle_*. Dieser Fallback nutzt Playwright und gibt anschließend das erweiterte HTML zurück.

lsf_normalize_url(url)

Normalisiere LSF-URLs für Duplikaterkennung beim Crawling.

Parameters:

Name Type Description Default
url

Rohe URL aus der LSF-Navigation.

required

Returns:

Type Description

Stabile Knotenkennung wie node_1234 oder die Original-URL, wenn

kein interpretierbarer root-Parameter vorhanden ist.

lsf_scrape_all_semesters(start_url, semester_liste, output_dir, url_column='URL_Event', method='path', include_html=True, html_column='html')

Führe den vollständigen LSF-Workflow für mehrere Semester aus.

Pro Semester werden Basisdaten erzeugt, Duplikate entfernt, Detailseiten gescrapt und die Ergebnisse in semesterbezogenen Dateien gespeichert.

Parameters:

Name Type Description Default
start_url str

LSF-Start-URL der Universität.

required
semester_liste

Liste der gewünschten Semesterbezeichnungen.

required
output_dir str

Zielordner für alle erzeugten Dateien.

required
url_column str

Spalte mit Veranstaltungs-URLs für das Detail-Scraping.

'URL_Event'
method str

Methode für den Basislauf, entweder "path" oder "search".

'path'
include_html bool

Wenn True, wird das rohe HTML jeder Detailseite gespeichert.

True
html_column str

Name der Spalte für das rohe HTML.

'html'

Returns:

Type Description
dict

Dictionary mit Semestername als Schlüssel und gescraptem DataFrame als Wert.

lsf_scrape_base_data(start_url=DEFAULT_START_URL, semester_liste=None, output_dir=None, method='path')

Erzeuge die Basisdaten eines oder mehrerer Semester aus einem LSF.

Die Funktion sammelt zunächst nur die Veranstaltungslisten und lädt noch keine Detailseiten einzelner Kurse.

Parameters:

Name Type Description Default
start_url

Start-URL der Ziel-LSF-Instanz.

DEFAULT_START_URL
semester_liste

Liste der zu erhebenden Semesterbezeichnungen.

None
output_dir

Zielordner für base_data.csv.

None
method

"path" für Baum-Navigation oder "search" für die Suchmaske.

'path'

Returns:

Type Description

Kein In-Memory-Ergebnis. Die Basisdaten werden in Dateien geschrieben.

Raises:

Type Description
ValueError

Wenn output_dir fehlt oder method ungültig ist.

lsf_scrape_veranstaltungsdetails(df, url_column, include_html=False, html_column='html', existing_results=None, save_path=None, save_every=None)

Lade und parse LSF-Detailseiten für eine Liste von Veranstaltungs-URLs.

Ein vorgeschalteter Basislauf liefert typischerweise eine Tabelle mit URL_Event. Diese Funktion ruft jede Detailseite auf und ergänzt daraus Titel, Grunddaten, Termine, Personen, Studiengänge, Module und weitere Angaben.

Parameters:

Name Type Description Default
df DataFrame

DataFrame mit einer Spalte für LSF-URLs.

required
url_column str

Name der Spalte mit den URLs.

required
include_html bool

Wenn True, wird das rohe HTML zusätzlich gespeichert.

False
html_column str

Name der Spalte für das rohe HTML.

'html'
existing_results DataFrame | None

Bereits vorhandene Detaildaten für Resume-Läufe.

None
save_path str | Path | None

Optionaler JSON-Pfad für Checkpoints und finale Ergebnisse.

None
save_every int | None

Checkpoint-Intervall in Anzahl neu gescrapter URLs.

None

Returns:

Type Description
DataFrame

DataFrame mit den ursprünglichen Eingabedaten plus allen erfolgreich

DataFrame

extrahierten Zusatzspalten.

lsf_select_semester(page, semester_name)

Wechsle im LSF zum gewünschten Semester und öffne das Vorlesungsverzeichnis.

Parameters:

Name Type Description Default
page

Aktive Playwright-Seite.

required
semester_name str

Exakt sichtbare Semesterbezeichnung im Ziel-LSF.

required