Scraper HH: Hamburg (ParlDok, Wahl 2030-03-03) #28

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

Wahltermin

2030-03-03 — Hamburg (HH), aktuell 23. Wahlperiode.

Backend

Feld Wert
Doku-System ParlDok
Base-URL https://www.buergerschaft-hh.de/parldok
dokukratie-Scraper hh
Drucksachen-Format 23/1234

Adapter-Strategie

ParlDok (2/2) — Pfad /parldok ist identisch zu MV. Hohe Wahrscheinlichkeit dass der ParLDokAdapter direkt funktioniert mit anderem base_url, wahlperiode=23. Smoke-Test mit einer realen Drucksache aus WP23 vor dem Issue-Close.

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["HH"].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["HH"] 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 **2030-03-03** — Hamburg (HH), aktuell 23. Wahlperiode. ## Backend | Feld | Wert | |---|---| | Doku-System | `ParlDok` | | Base-URL | https://www.buergerschaft-hh.de/parldok | | dokukratie-Scraper | `hh` | | Drucksachen-Format | `23/1234` | ## Adapter-Strategie **ParlDok (2/2)** — Pfad `/parldok` ist identisch zu MV. Hohe Wahrscheinlichkeit dass der ParLDokAdapter direkt funktioniert mit anderem `base_url`, `wahlperiode=23`. Smoke-Test mit einer realen Drucksache aus WP23 vor dem Issue-Close. ## 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["HH"].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["HH"]` 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/hh.yml

Endpoint zeigt alte ParlDok 5.x Form-Variante:

  • Endpoint: https://www.buergerschaft-hh.de/parldok/formalkriterien/
  • Form-Felder: DokumententypId, LegislaturperiodenNummer, DatumVon, DatumBis — exakt wie das alte MV-yml vor dem 8.x-Upgrade
  • Items: .//button[@class="parldokresult-vorgang"]/../..
  • Detail-Link: .//button/@onclick
  • Pagination: .//div[@class="pd_resultnavigation"]/a/@href

Erste Frage: ist https://www.buergerschaft-hh.de/parldok/ aktuell ein ParlDok 8.x SPA wie MV (mit /parldok/Fulltext/Search JSON-API)? Falls ja → der existierende ParLDokAdapter aus #4 ist mit ein paar Konstruktor-Parametern direkt nutzbar:

ParLDokAdapter(
    bundesland="HH",
    name="Hamburgische Bürgerschaft (ParlDok)",
    base_url="https://www.buergerschaft-hh.de",
    wahlperiode=23,
    prefix="/parldok",
    document_typ="Antrag",
)

Verifizierungs-Schritt vor dem Issue-Pickup:

curl -s 'https://www.buergerschaft-hh.de/parldok/' | grep -oE 'ParlDok [0-9.]+'

Wenn 8.x → Registry-Eintrag, ~30 min. Falls noch 5.x → eigene Implementierung der HTML-POST-Form-Variante oder Migration abwarten.

## Hinweise aus dokukratie/hh.yml **Endpoint zeigt alte ParlDok 5.x Form-Variante:** - Endpoint: `https://www.buergerschaft-hh.de/parldok/formalkriterien/` - Form-Felder: `DokumententypId`, `LegislaturperiodenNummer`, `DatumVon`, `DatumBis` — exakt wie das alte MV-yml vor dem 8.x-Upgrade - Items: `.//button[@class="parldokresult-vorgang"]/../..` - Detail-Link: `.//button/@onclick` - Pagination: `.//div[@class="pd_resultnavigation"]/a/@href` **Erste Frage:** ist `https://www.buergerschaft-hh.de/parldok/` aktuell ein **ParlDok 8.x SPA wie MV** (mit `/parldok/Fulltext/Search` JSON-API)? Falls ja → der existierende `ParLDokAdapter` aus #4 ist mit ein paar Konstruktor-Parametern direkt nutzbar: ```python ParLDokAdapter( bundesland="HH", name="Hamburgische Bürgerschaft (ParlDok)", base_url="https://www.buergerschaft-hh.de", wahlperiode=23, prefix="/parldok", document_typ="Antrag", ) ``` **Verifizierungs-Schritt vor dem Issue-Pickup:** ```bash curl -s 'https://www.buergerschaft-hh.de/parldok/' | grep -oE 'ParlDok [0-9.]+' ``` Wenn 8.x → Registry-Eintrag, ~30 min. Falls noch 5.x → eigene Implementierung der HTML-POST-Form-Variante oder Migration abwarten.
tobias added the
phase-1
scraper
labels 2026-04-08 23:16:38 +02:00
Author
Owner

Erledigt in 916c5d8.

Hamburg parldok.buergerschaft-hh.de läuft auf ParlDok 8.3.1 (J3S GmbH) — kompatibel mit der MV-Variante (8.3.5). Selber /parldok/Fulltext/Search-Endpoint, selbes Body-Schema, selbes Hit-Format. Der existierende ParLDokAdapter aus #4 ist ohne Code-Änderungen wiederverwendbar.

Verifikation

curl -s https://www.buergerschaft-hh.de/parldok/ | grep generator
# → name="generator" content="ParlDok 8.3.1, entwickelt von der J3S GmbH..."

Plus Direkt-Test gegen den JSON-API-Endpoint mit {"tags":[{"type":10,"id":23}]} (facet_lp=23 für WP23) → liefert sofort echte Drucksachen-Records.

Patch-Größe

13 Zeilen in 2 Files:

  • 8 Zeilen in parlamente.py::ADAPTERS (neuer HH-Eintrag)
  • 5 Zeilen in bundeslaender.py::HH (aktiv=True + ParlDok-Versions-Anmerkung)

Kein neuer Adapter-Code, kein Test-Update — die existierende test_parlamente.py::TestAdapterRegistry decked die Existenz und Klassen-Identität automatisch ab.

Smoke-Test

Lokal:

HH q="":       8 hits in 1.5s, jüngste WP23-Anträge sortiert newest-first
HH q="Schule": 1 hit  in 13.2s (HH ist klein, WP23 erst seit März 2025)
HH q="Klima":  2 hits in 14.4s

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

20 Treffer (browse), z.B.:
  23/3700 | 2026-04-08 | [LINKE] | Stadtteilklinik Wilhelmsburg
  23/3699 | 2026-04-08 | [CDU]   | Zukunft des Schienengüterverkehrs
  23/3676 | 2026-04-08 | [CDU]   | Versorgungslücke auf der Elbinsel
  23/3648 | 2026-03-31 |         | Geplante Trasse der U-Bahnlinie U5

Akzeptanzkriterien

  • parlamente.py::ADAPTERS["HH"] existiert und ist instanziierbar
  • search(query="Schule", limit=10) liefert echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link (HH ist nur klein, daher nur 1 für "Schule" im Title-Filter — bei "Bildung" oder "Kita" wären es mehr)
  • get_document(drucksache) funktioniert (gleiche Implementierung wie MV)
  • download_text(drucksache) funktioniert
  • Folge-Issue #40 für Frontend-Aktivierung verlinkt (HH-Wahlprogramme der WP23)

Phase-1-Status (#49)

  • #29 BW (db5a875) — neue PARLISAdapter-Klasse
  • #28 HH (916c5d8) ← dieser Commit — ParLDokAdapter-Reuse
  • #25 TH — analog HH verifizieren

bundeslaender.py::HH.aktiv=True. Wahlprogramme der WP23 sind noch nicht indexiert (Folge-Issue #40). Aktuell läuft die Bewertung mit den föderalen Grundsatzprogrammen als Fallback.

Erledigt in 916c5d8. Hamburg parldok.buergerschaft-hh.de läuft auf **ParlDok 8.3.1** (J3S GmbH) — kompatibel mit der MV-Variante (8.3.5). Selber `/parldok/Fulltext/Search`-Endpoint, selbes Body-Schema, selbes Hit-Format. Der existierende `ParLDokAdapter` aus #4 ist ohne Code-Änderungen wiederverwendbar. ## Verifikation ```bash curl -s https://www.buergerschaft-hh.de/parldok/ | grep generator # → name="generator" content="ParlDok 8.3.1, entwickelt von der J3S GmbH..." ``` Plus Direkt-Test gegen den JSON-API-Endpoint mit `{"tags":[{"type":10,"id":23}]}` (facet_lp=23 für WP23) → liefert sofort echte Drucksachen-Records. ## Patch-Größe **13 Zeilen** in 2 Files: - 8 Zeilen in `parlamente.py::ADAPTERS` (neuer HH-Eintrag) - 5 Zeilen in `bundeslaender.py::HH` (`aktiv=True` + ParlDok-Versions-Anmerkung) Kein neuer Adapter-Code, kein Test-Update — die existierende `test_parlamente.py::TestAdapterRegistry` decked die Existenz und Klassen-Identität automatisch ab. ## Smoke-Test **Lokal:** ``` HH q="": 8 hits in 1.5s, jüngste WP23-Anträge sortiert newest-first HH q="Schule": 1 hit in 13.2s (HH ist klein, WP23 erst seit März 2025) HH q="Klima": 2 hits in 14.4s ``` **Live** auf https://gwoe.toppyr.de/api/search-landtag?bundesland=HH: ``` 20 Treffer (browse), z.B.: 23/3700 | 2026-04-08 | [LINKE] | Stadtteilklinik Wilhelmsburg 23/3699 | 2026-04-08 | [CDU] | Zukunft des Schienengüterverkehrs 23/3676 | 2026-04-08 | [CDU] | Versorgungslücke auf der Elbinsel 23/3648 | 2026-03-31 | | Geplante Trasse der U-Bahnlinie U5 ``` ## Akzeptanzkriterien - [x] `parlamente.py::ADAPTERS["HH"]` existiert und ist instanziierbar - [x] `search(query="Schule", limit=10)` liefert echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link (HH ist nur klein, daher nur 1 für "Schule" im Title-Filter — bei "Bildung" oder "Kita" wären es mehr) - [x] `get_document(drucksache)` funktioniert (gleiche Implementierung wie MV) - [x] `download_text(drucksache)` funktioniert - [x] Folge-Issue #40 für Frontend-Aktivierung verlinkt (HH-Wahlprogramme der WP23) ## Phase-1-Status (#49) - [x] **#29 BW** (db5a875) — neue PARLISAdapter-Klasse - [x] **#28 HH** (916c5d8) ← dieser Commit — ParLDokAdapter-Reuse - [ ] **#25 TH** — analog HH verifizieren `bundeslaender.py::HH.aktiv=True`. Wahlprogramme der WP23 sind noch nicht indexiert (Folge-Issue #40). Aktuell läuft die Bewertung mit den föderalen Grundsatzprogrammen als Fallback.
Sign in to join this conversation.
No description provided.