gwoe-antragspruefer/app/protokoll_parsers
Dotty Dotter d0f7b9217c feat(#161): SL-Parser produktiv — Saarland HTML-Abstimmungsergebnisse
Saarland publiziert keine Wortprotokolle, sondern eigene HTML-Seiten
mit strukturierten Abstimmungsergebnissen pro Sitzung:

  <p>Drucksache 17/2076 ... in Erster Lesung mit Stimmenmehrheit
  angenommen ... [SPD: dafür; CDU und AfD: dagegen]</p>

Daher Input ist HTML, nicht PDF. Parser nutzt LI-Block-Iteration und
extrahiert pro Block:
- Drucksache aus "Drucksache N/M"
- Status aus "(einstimmig|mit Stimmenmehrheit)? (angenommen|abgelehnt)"
- Vote-Block aus "[SPD: dafür; CDU: dagegen; AfD: Enthaltung]"
- einstimmig=True falls Status enthaelt "einstimmig"

Vote-Bracket-Parser (eigenstaendig vs. Reden-Stil-Parser anderer BL):
- Splits per ; → "Phrase: Status"
- Phrase per Wortgrenzen-Regex auf {SPD,CDU,AfD} matchen
- Status-Map: dafür→ja, dagegen→nein, Enthaltung→enthaltung

URL-Pattern (nicht direkt vorhersagbar wegen Datums-Slug):
https://www.landtag-saar.de/aktuelles/mitteilungen/abstimmungsergebnisse-der-{n}-landtagssitzung-vom-{datum}/

Auto-Ingest via Index-Scrape (analog HH/HE/SH):
- /aktuelles/mitteilungen/ scrape
- WP16-URLs (mit "wahlperiode-vom") ueberspringen
- Pro neue Sitzung: HTML herunterladen, ingest_pdf-API auf .html-Datei

Tests: 18 SL-Tests (Verifikation Sitzung 46 → 18 Votes mit korrekten
JA/NEIN/ENTH-Listen). Stand: 9 produktive Parser
(NRW, BUND, BE, HH, TH, HE, SH, HB, SL).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 01:53:51 +02:00
..
__init__.py feat(#161): SL-Parser produktiv — Saarland HTML-Abstimmungsergebnisse 2026-04-29 01:53:51 +02:00
bb.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
be.py feat(#150): BE-Parser produktiv — Berliner Abgeordnetenhaus-Plenarprotokolle 2026-04-29 00:37:47 +02:00
bund.py feat(#148): BUND-Parser produktiv — Bundestags-XML-Plenarprotokolle 2026-04-28 23:21:39 +02:00
bw.py docs(#151): BW-Datenmodell-Inkompatibilitaet vermerkt 2026-04-28 23:29:31 +02:00
by.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
hb.py feat(#153): HB-Parser produktiv — Bremer Beschlussprotokolle (Status-Only) 2026-04-29 01:41:40 +02:00
he.py feat(#154): HE-Parser produktiv — Hessen Beschlussprotokoll (Status-Only) 2026-04-29 01:19:02 +02:00
hh.py feat(#155): HH-Parser produktiv — Hamburg Beschlussprotokolle 2026-04-29 00:57:58 +02:00
lsa.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
mv.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
ni.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
nrw.py feat(#126): protokoll_parsers/-Sub-Package + Registry-Pattern + ADR 0009 2026-04-28 08:37:31 +02:00
rp.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
sh.py feat(#160): SH-Parser produktiv — Schleswig-Holsteiner Plenarprotokolle 2026-04-29 01:29:06 +02:00
sl.py feat(#161): SL-Parser produktiv — Saarland HTML-Abstimmungsergebnisse 2026-04-29 01:53:51 +02:00
sn.py feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender 2026-04-28 23:09:07 +02:00
th.py feat(#163): TH-Parser produktiv — Thueringer Plenarprotokolle 2026-04-29 01:11:58 +02:00