Scraper HE: Hessen (StarWeb, Wahl 2028-10-22) #24

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

Wahltermin

2028-10-22 — Hessen (HE), aktuell 21. Wahlperiode.

Backend

Feld Wert
Doku-System StarWeb
Base-URL https://starweb.hessen.de/starweb/LIS
dokukratie-Scraper he
Drucksachen-Format 21/1234

Adapter-Strategie

StarWeb (3/6) — Wiederverwendung. Hinweis: HE nutzt starweb.hessen.de/starweb/LIS mit explizitem LIS-Suffix; vermutlich braucht der Adapter einen path_prefix-Parameter.

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["HE"].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["HE"] 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 **2028-10-22** — Hessen (HE), aktuell 21. Wahlperiode. ## Backend | Feld | Wert | |---|---| | Doku-System | `StarWeb` | | Base-URL | https://starweb.hessen.de/starweb/LIS | | dokukratie-Scraper | `he` | | Drucksachen-Format | `21/1234` | ## Adapter-Strategie **StarWeb (3/6)** — Wiederverwendung. Hinweis: HE nutzt `starweb.hessen.de/starweb/LIS` mit explizitem `LIS`-Suffix; vermutlich braucht der Adapter einen `path_prefix`-Parameter. ## 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["HE"].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["HE"]` 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/he.yml

StarWeb-Servlet (LIS = Landesinformationssystem):

  • Endpoint: http://starweb.hessen.de/starweb/LIS/servlet.starweb?path=LIS/PdPi.web
  • Pagination: ?path=LIS/PdPi_FLMore20.web
  • Form-Felder:
    • WPDatabase (legislative_term)
    • dokumenttyp (document_type)
    • zeitraum_von / zeitraum_bis
    • __action=69 (search), __action=262 (next page)
    • status=X
  • Items: .//tbody[@starweb_type="Record Repeater"]
  • Drucksache: .//span[@name="OFR_Drs"]
  • Initiator: .//span[@name="OFR_Initiator"]
  • Title: .//span[@name="OFR_Betreff"]
  • Detail-Link: .//span[@name="OFR_Betreff"]/a/@onclick (JavaScript-onclick, nicht klassisches href)
  • PDF: .//a[contains(text(), "Originaldokument als PDF-Datei")]

Synergie: Wiederverwendung StarWebAdapter aus #27. HE braucht http (kein https) und hat eigene Form-Field-Namen (WPDatabase statt LISSH_WP, zeitraum_von statt FASTDATV).

## Hinweise aus dokukratie/he.yml **StarWeb-Servlet** (LIS = Landesinformationssystem): - Endpoint: `http://starweb.hessen.de/starweb/LIS/servlet.starweb?path=LIS/PdPi.web` - Pagination: `?path=LIS/PdPi_FLMore20.web` - Form-Felder: - `WPDatabase` (legislative_term) - `dokumenttyp` (document_type) - `zeitraum_von` / `zeitraum_bis` - `__action=69` (search), `__action=262` (next page) - `status=X` - Items: `.//tbody[@starweb_type="Record Repeater"]` - Drucksache: `.//span[@name="OFR_Drs"]` - Initiator: `.//span[@name="OFR_Initiator"]` - Title: `.//span[@name="OFR_Betreff"]` - Detail-Link: `.//span[@name="OFR_Betreff"]/a/@onclick` (JavaScript-onclick, nicht klassisches href) - PDF: `.//a[contains(text(), "Originaldokument als PDF-Datei")]` **Synergie:** Wiederverwendung `StarWebAdapter` aus #27. HE braucht http (kein https) und hat eigene Form-Field-Namen (WPDatabase statt LISSH_WP, zeitraum_von statt FASTDATV).
tobias added the
phase-2
scraper
labels 2026-04-08 23:16:37 +02:00
Author
Owner

Sondiert in 02ff142, Adapter wird nur leicht anders.

starweb.hessen.de läuft auch auf dem portala/eUI-Backend (nicht das alte StarWeb-Servlet). Endpoint /portal/browse.tt.json, db_id hlt.lis. Source-Probe lieferte 10871 Treffer für WP21 ohne Filter.

Was nicht klappt mit dem unmodifizierten PortalaAdapter

  1. TYP=DOKDBE-Filter wird vom HE-Server abgelehnt — durch typ_filter=None in Konstruktor (Phase-2-Erweiterung, Commit 02ff142) lösbar
  2. (DAT,DDAT,SDAT= ...)-Datumsfilter wird abgelehnt — durch omit_date_filter=True lösbar
  3. Hit-Format ist anders: HE nutzt zwar efxRecordRepeater-Cards, aber:
    • Title direkt im <h3 class="h5">...</h3> (kein <span>-Wrapper wie BE/BB)
    • Drucksachen-Nummer als Drucks. 21/1424 im Title (mit Punkt, ohne <a>-Link)
    • Kein <span class="h6"> für Doctype/Datum/Urheber-Meta
    • Card-Header zeigt nur den Doctype als <span class="font-weight-semibold">Ausschusssitzung</span>

Mein bestehender BE-Card-Parser greift daher nicht.

Was zu tun ist

PortalaAdapter._parse_hit_list_cards() um eine HE-Variante erweitern: alternative Title-Regex ohne span-Wrap, Drucksachen-Pattern auf Drucks\.\s+(\d+/\d+) erweitern, Datum/Urheber aus dem Card-Body extrahieren statt aus h6.

Estimated effort: 1-2h reine Parser-Arbeit, plus pytest-Fixture aus dem HE-Card-HTML. Ist im Working-Tree bereits ein PortalaAdapter-Eintrag mit typ_filter=None, omit_date_filter=True vorgemerkt — der wurde wieder rausgenommen, weil er ohne Parser-Fix 0 Treffer liefern würde.

Sondiert in 02ff142, **Adapter wird nur leicht anders**. starweb.hessen.de läuft auch auf dem **portala/eUI-Backend** (nicht das alte StarWeb-Servlet). Endpoint `/portal/browse.tt.json`, db_id `hlt.lis`. Source-Probe lieferte 10871 Treffer für WP21 ohne Filter. ## Was nicht klappt mit dem unmodifizierten PortalaAdapter 1. `TYP=DOKDBE`-Filter wird vom HE-Server abgelehnt — durch `typ_filter=None` in Konstruktor (Phase-2-Erweiterung, Commit 02ff142) lösbar 2. `(DAT,DDAT,SDAT= ...)`-Datumsfilter wird abgelehnt — durch `omit_date_filter=True` lösbar 3. **Hit-Format ist anders**: HE nutzt zwar efxRecordRepeater-Cards, aber: - Title direkt im `<h3 class="h5">...</h3>` (kein `<span>`-Wrapper wie BE/BB) - Drucksachen-Nummer als `Drucks. 21/1424` im Title (mit Punkt, ohne `<a>`-Link) - Kein `<span class="h6">` für Doctype/Datum/Urheber-Meta - Card-Header zeigt nur den Doctype als `<span class="font-weight-semibold">Ausschusssitzung</span>` Mein bestehender BE-Card-Parser greift daher nicht. ## Was zu tun ist `PortalaAdapter._parse_hit_list_cards()` um eine HE-Variante erweitern: alternative Title-Regex ohne span-Wrap, Drucksachen-Pattern auf `Drucks\.\s+(\d+/\d+)` erweitern, Datum/Urheber aus dem Card-Body extrahieren statt aus h6. Estimated effort: 1-2h reine Parser-Arbeit, plus pytest-Fixture aus dem HE-Card-HTML. Ist im Working-Tree bereits ein PortalaAdapter-Eintrag mit `typ_filter=None, omit_date_filter=True` vorgemerkt — der wurde wieder rausgenommen, weil er ohne Parser-Fix 0 Treffer liefern würde.
Author
Owner

Erledigt durch Roadmap Phase H / Commit 4a8986e. Eigenständige StarWebHEAdapter-Klasse, 2-Step-Pipeline, Perl-Dump-Card-Parser. Live verifiziert: 5 WP21-Anträge inkl. Berichtsanträgen mit korrekten GRÜNE-Fraktionen und PDF-Links.

Erledigt durch Roadmap Phase H / Commit `4a8986e`. Eigenständige `StarWebHEAdapter`-Klasse, 2-Step-Pipeline, Perl-Dump-Card-Parser. Live verifiziert: 5 WP21-Anträge inkl. Berichtsanträgen mit korrekten GRÜNE-Fraktionen und PDF-Links.
Sign in to join this conversation.
No description provided.