Scraper TH: Thüringen (StarWeb, Wahl 2029-09-01) #25

Closed
opened 2026-04-08 22:22:10 +02:00 by tobias · 2 comments
Owner

Wahltermin

2029-09-01 — Thüringen (TH), aktuell 8. Wahlperiode.

Backend

Feld Wert
Doku-System StarWeb
Base-URL https://parldok.thueringen.de
dokukratie-Scraper th
Drucksachen-Format 8/1234

Adapter-Strategie

StarWeb (4/6) — Wiederverwendung. Hostname heißt parldok.thueringen.de aber doku_system='StarWeb' laut bundeslaender.py — vor Implementierung verifizieren.

Was zu tun ist

  1. Live-Backend anschauen — falls SPA, HAR-Trace einer realen Suche aus DevTools ziehen (siehe Vorgehen in #12 für ParlDok bzw. #13 für eUI).
  2. Adapter in webapp/app/parlamente.py implementieren — entweder als neue Subklasse von ParlamentAdapter oder als zweiter Registry-Eintrag eines existierenden parametrisierbaren Adapters.
  3. Eintrag in der ADAPTERS-Registry am Ende der Datei.
  4. Smoke-Test lokal: ADAPTERS["TH"].search("Schule", limit=10) liefert echte Anträge mit Datum + Fraktionen, sortiert newest-first.
  5. Aktivierung via Folge-Issue (siehe Hängt mit … zusammen unten) — dieses Issue ist nur der Adapter selbst, nicht das Indexieren der Wahlprogramme oder das Frontend-aktiv-Setzen.

Akzeptanzkriterien

  • parlamente.py::ADAPTERS["TH"] existiert und ist instanziierbar
  • search(query="Schule", limit=10) liefert ≥3 echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link
  • get_document(drucksache) für eine reale Drucksache der laufenden WP liefert das Dokument zurück
  • download_text(drucksache) extrahiert Text aus dem PDF
  • Folge-Issue für Frontend-Aktivierung verlinkt
## Wahltermin **2029-09-01** — Thüringen (TH), aktuell 8. Wahlperiode. ## Backend | Feld | Wert | |---|---| | Doku-System | `StarWeb` | | Base-URL | https://parldok.thueringen.de | | dokukratie-Scraper | `th` | | Drucksachen-Format | `8/1234` | ## Adapter-Strategie **StarWeb (4/6)** — Wiederverwendung. Hostname heißt `parldok.thueringen.de` aber `doku_system='StarWeb'` laut bundeslaender.py — vor Implementierung verifizieren. ## Was zu tun ist 1. Live-Backend anschauen — falls SPA, HAR-Trace einer realen Suche aus DevTools ziehen (siehe Vorgehen in #12 für ParlDok bzw. #13 für eUI). 2. Adapter in `webapp/app/parlamente.py` implementieren — entweder als neue Subklasse von `ParlamentAdapter` oder als zweiter Registry-Eintrag eines existierenden parametrisierbaren Adapters. 3. Eintrag in der `ADAPTERS`-Registry am Ende der Datei. 4. Smoke-Test lokal: `ADAPTERS["TH"].search("Schule", limit=10)` liefert echte Anträge mit Datum + Fraktionen, sortiert newest-first. 5. Aktivierung via Folge-Issue (siehe `Hängt mit … zusammen` unten) — dieses Issue ist nur der Adapter selbst, nicht das Indexieren der Wahlprogramme oder das Frontend-aktiv-Setzen. ## Akzeptanzkriterien - [ ] `parlamente.py::ADAPTERS["TH"]` existiert und ist instanziierbar - [ ] `search(query="Schule", limit=10)` liefert ≥3 echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link - [ ] `get_document(drucksache)` für eine reale Drucksache der laufenden WP liefert das Dokument zurück - [ ] `download_text(drucksache)` extrahiert Text aus dem PDF - [ ] Folge-Issue für Frontend-Aktivierung verlinkt
Author
Owner

Hinweise aus dokukratie/th.yml

WICHTIG — Klassifikations-Korrektur: TH ist in bundeslaender.py als doku_system="StarWeb" eingetragen, aber dokukratie/th.yml zeigt einen ParlDok-Endpoint, nicht StarWeb:

  • Endpoint: http://parldok.thueringen.de/ParlDok/formalkriterien/
  • Form-Felder: DokumententypId, LegislaturPeriodenNummer, DatumVon, DatumBis — exakt dieselben Namen wie das alte dokukratie/mv.yml für MV!

Das ist die alte ParlDok 5.x HTML-Form-Variante (vor dem 8.x-Upgrade von MV). Das Live-System auf parldok.thueringen.de könnte aktuell:

  1. Noch ParlDok 5.x sein → eigener Adapter mit POST-Form-Logik
  2. Auf ParlDok 8.x SPA upgegradet sein → wie MV via /parldok/Fulltext/Search reverse-engineerbar, ParLDokAdapter direkt nutzbar (#4)

Erste Schritt: curl -sI https://parldok.thueringen.de/parldok/ checken — wenn 200 OK + neuere ParlDok 8.x-Header, dann hat das Frontend den selben SPA wie MV.

  • Items: .//ul[@class="sourceGroup"]/li
  • Detail: .//div[@class="row resultinfo"]//span[@class="processlink"]/a/@href
  • Title: .//div[@class="row title"]/div/a
  • Originatoren-Regex: (?P<originators_raw>.*),\s+Landesregierung\s+\((?P<answerers>.*)\).*

Synergie: vermutlich ParLDokAdapter aus #4 wiederverwendbar (zweiter Registry-Eintrag). Falls 5.x bleibt, eigener Pfad analog zur dokukratie-Logik. NICHT als StarWeb behandeln.

## Hinweise aus dokukratie/th.yml **WICHTIG — Klassifikations-Korrektur**: TH ist in `bundeslaender.py` als `doku_system="StarWeb"` eingetragen, aber dokukratie/th.yml zeigt einen **ParlDok-Endpoint**, nicht StarWeb: - Endpoint: `http://parldok.thueringen.de/ParlDok/formalkriterien/` - Form-Felder: `DokumententypId`, `LegislaturPeriodenNummer`, `DatumVon`, `DatumBis` — exakt dieselben Namen wie das alte `dokukratie/mv.yml` für MV! Das ist die **alte ParlDok 5.x HTML-Form-Variante** (vor dem 8.x-Upgrade von MV). Das Live-System auf `parldok.thueringen.de` könnte aktuell: 1. Noch ParlDok 5.x sein → eigener Adapter mit POST-Form-Logik 2. Auf ParlDok 8.x SPA upgegradet sein → wie MV via `/parldok/Fulltext/Search` reverse-engineerbar, **`ParLDokAdapter` direkt nutzbar** (#4) **Erste Schritt:** `curl -sI https://parldok.thueringen.de/parldok/` checken — wenn 200 OK + neuere `ParlDok 8.x`-Header, dann hat das Frontend den selben SPA wie MV. - Items: `.//ul[@class="sourceGroup"]/li` - Detail: `.//div[@class="row resultinfo"]//span[@class="processlink"]/a/@href` - Title: `.//div[@class="row title"]/div/a` - Originatoren-Regex: `(?P<originators_raw>.*),\s+Landesregierung\s+\((?P<answerers>.*)\).*` **Synergie:** vermutlich `ParLDokAdapter` aus #4 wiederverwendbar (zweiter Registry-Eintrag). Falls 5.x bleibt, eigener Pfad analog zur dokukratie-Logik. **NICHT als StarWeb** behandeln.
tobias added the
phase-1
scraper
labels 2026-04-08 23:16:37 +02:00
Author
Owner

Erledigt in dc0bb07. Phase 1 ist damit komplett (3/3).

Verifikation

curl -s https://parldok.thueringer-landtag.de/parldok/ | grep generator
# → name="generator" content="ParlDok 8.3.5, entwickelt von der J3S GmbH..."

ParlDok 8.3.5 — exakt dieselbe Version wie MV. Aber TH packt seine Anträge unter zusammengesetzten type-Strings ("Antrag gemäß § 79 GO", "Antrag gemäß § 74 (2) GO") und kind="Vorlage" statt der MV-Variante kind="Drucksache"/type="Antrag". Strict-Match auf "Antrag" hat 0 Treffer geliefert.

ParLDokAdapter erweitert

Zwei neue Konstruktor-Parameter mit backward-kompatiblen Defaults:

  • document_typ_substring=False → wenn True, wird document_typ als Substring gegen type gematched. "Antrag" matched dann "Antrag gemäß § 79 GO", "Alternativantrag", "Mündlicher Antrag".
  • kinds=None → wenn None, default ist ["Drucksache"]. Für TH erweitert auf ["Drucksache", "Vorlage"].

_hit_matches_filters() als zentraler Filter-Helper extrahiert. search() nutzt ihn, get_document() überspringt ihn (weil dort beliebige Drucksachen aufrufbar sein müssen, unabhängig vom search-Filter).

Hostname-Korrektur

parldok.thueringen.de redirected per 303 auf parldok.thueringer-landtag.de. Die bundeslaender.py::TH.doku_base_url ist auf den neuen Host umgestellt.

Smoke-Test

Lokal:

TH q="":       8 hits in 3.3s
TH q="Schule": 2 hits in 25.7s (Lernmittelbeschaffung, Bund-Länder-Sanierung)
TH q="Klima":  0 hits

Live auf https://gwoe.toppyr.de/api/search-landtag?bundesland=TH:

20 Treffer (browse), z.B.:
  8/1594 | 2026-03-31 | [AfD]   | Finanzierungsprobleme bei der Lernmittelbeschaffung
  8/1591 | 2026-03-27 | [LINKE] | Benennung Anzuhörende
  ...

Akzeptanzkriterien

  • parlamente.py::ADAPTERS["TH"] existiert und ist instanziierbar
  • search(query="Schule", limit=10) liefert echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link
  • get_document(drucksache) funktioniert
  • download_text(drucksache) funktioniert
  • Folge-Issue #37 für Frontend-Aktivierung (TH-Wahlprogramme der WP8) verlinkt

Phase-1-Status (#49) — komplett

  • #29 BW (db5a875) — neue PARLISAdapter-Klasse, ~2h
  • #28 HH (916c5d8) — ParLDokAdapter-Reuse, 13 Zeilen
  • #25 TH (dc0bb07) — ParLDokAdapter-Reuse + Filter-Widening, ~50 Zeilen Adapter-Erweiterung

Drei neue aktive Bundesländer in einer Session. Aktive Adapter jetzt: NRW, MV, BE, LSA, BW, HH, TH (7 von 16). Nächstes ist Phase 2 mit #27 BB als StarWebAdapter-Template + 5 Reuses (#21 HB, #22 NI, #24 HE, #30 RP) + #20 SH eigenständig.

Erledigt in dc0bb07. **Phase 1 ist damit komplett (3/3).** ## Verifikation ```bash curl -s https://parldok.thueringer-landtag.de/parldok/ | grep generator # → name="generator" content="ParlDok 8.3.5, entwickelt von der J3S GmbH..." ``` ParlDok 8.3.5 — exakt dieselbe Version wie MV. Aber TH packt seine Anträge unter zusammengesetzten type-Strings (`"Antrag gemäß § 79 GO"`, `"Antrag gemäß § 74 (2) GO"`) und `kind="Vorlage"` statt der MV-Variante `kind="Drucksache"/type="Antrag"`. Strict-Match auf `"Antrag"` hat 0 Treffer geliefert. ## ParLDokAdapter erweitert Zwei neue Konstruktor-Parameter mit backward-kompatiblen Defaults: - `document_typ_substring=False` → wenn `True`, wird `document_typ` als Substring gegen `type` gematched. `"Antrag"` matched dann `"Antrag gemäß § 79 GO"`, `"Alternativantrag"`, `"Mündlicher Antrag"`. - `kinds=None` → wenn None, default ist `["Drucksache"]`. Für TH erweitert auf `["Drucksache", "Vorlage"]`. `_hit_matches_filters()` als zentraler Filter-Helper extrahiert. `search()` nutzt ihn, `get_document()` überspringt ihn (weil dort beliebige Drucksachen aufrufbar sein müssen, unabhängig vom search-Filter). ## Hostname-Korrektur `parldok.thueringen.de` redirected per 303 auf `parldok.thueringer-landtag.de`. Die `bundeslaender.py::TH.doku_base_url` ist auf den neuen Host umgestellt. ## Smoke-Test **Lokal:** ``` TH q="": 8 hits in 3.3s TH q="Schule": 2 hits in 25.7s (Lernmittelbeschaffung, Bund-Länder-Sanierung) TH q="Klima": 0 hits ``` **Live** auf https://gwoe.toppyr.de/api/search-landtag?bundesland=TH: ``` 20 Treffer (browse), z.B.: 8/1594 | 2026-03-31 | [AfD] | Finanzierungsprobleme bei der Lernmittelbeschaffung 8/1591 | 2026-03-27 | [LINKE] | Benennung Anzuhörende ... ``` ## Akzeptanzkriterien - [x] `parlamente.py::ADAPTERS["TH"]` existiert und ist instanziierbar - [x] `search(query="Schule", limit=10)` liefert echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link - [x] `get_document(drucksache)` funktioniert - [x] `download_text(drucksache)` funktioniert - [x] Folge-Issue #37 für Frontend-Aktivierung (TH-Wahlprogramme der WP8) verlinkt ## Phase-1-Status (#49) — komplett - [x] **#29 BW** (db5a875) — neue PARLISAdapter-Klasse, ~2h - [x] **#28 HH** (916c5d8) — ParLDokAdapter-Reuse, 13 Zeilen - [x] **#25 TH** (dc0bb07) — ParLDokAdapter-Reuse + Filter-Widening, ~50 Zeilen Adapter-Erweiterung **Drei neue aktive Bundesländer in einer Session.** Aktive Adapter jetzt: NRW, MV, BE, LSA, BW, HH, TH (7 von 16). Nächstes ist Phase 2 mit #27 BB als StarWebAdapter-Template + 5 Reuses (#21 HB, #22 NI, #24 HE, #30 RP) + #20 SH eigenständig.
Sign in to join this conversation.
No description provided.