gwoe-antragspruefer/app/protokoll_parsers/bund.py
Dotty Dotter c0692b3078 feat(#106 Folge): 16 Stub-Parser + Tracking-Issues fuer alle Bundeslaender
Pro BL (BUND + 15 Laender) ein Modul app/protokoll_parsers/<bl>.py mit:
- Recherche-Findings im Docstring (Doku-System, Base-URL, Format,
  URL-Discovery-Status, Familie, Aufwand-Schaetzung)
- parse_protocol() raised NotImplementedError mit Hinweis auf Issue-Tracker
- *Nicht* in PROTOKOLL_PARSERS-Registry → Auto-Ingest-Cron uebersieht sie

Tracking-Issues #148-#163 auf Gitea, jeweils mit den Recherche-Findings
und einer Checkliste fuer die Implementer-Session.

Roadmap-Doc (docs/protokoll-parser-roadmap.md) aktualisiert mit
Stub→Issue-Mapping-Tabelle.

Wenn der Implementer pro BL fertig ist:
1. NotImplementedError durch echten Parser ersetzen
2. Eintrag in app/protokoll_parsers/__init__.py::PROTOKOLL_PARSERS
3. PROTO_TARGETS in scripts/auto-ingest-protocols.sh ergaenzen

787 Tests gruen, NRW unveraendert.
2026-04-28 23:09:07 +02:00

94 lines
3.2 KiB
Python

"""Bundestag (BUND) — Plenarprotokoll-Parser STUB (#106 Folge, ADR 0009).
**Status: noch nicht implementiert.** Dieser Modul-Stub enthaelt
Recherche-Findings, sodass die Implementer-Session direkt produktiv
loslegen kann. Der Stub wird **nicht** in
``app.protokoll_parsers.PROTOKOLL_PARSERS`` registriert — der
Auto-Ingest-Cron ueberspringt BUND solange.
## Recherche 2026-04-28
### URL-Pattern
Plenum-Protokoll als XML (strukturiert):
```
https://dserver.bundestag.de/btp/{wp}/{wp}{n:03}.xml
```
Beispiel WP20 Sitzung 184: ``https://dserver.bundestag.de/btp/20/20184.xml``
Plenum-Protokoll als PDF (rendert dasselbe):
```
https://dserver.bundestag.de/btp/{wp}/{wp}{n:03}.pdf
```
### XML-Format
Top-Level: ``<dbtplenarprotokoll>`` mit Children:
- ``<vorspann>`` — Sitzungsmetadaten
- ``<sitzungsverlauf>`` — Reden + Tagesordnungspunkte
- ``<anlagen>`` — Beschluss-Anlagen, namentliche Abstimmungen
- ``<rednerliste>``
Tags: ``<rede>``, ``<tagesordnungspunkt>``, ``<kommentar>`` (Regie-
Anweisungen wie "(Beifall bei der CDU/CSU)"), ``<redner>`` mit
``<fraktion>``-Untertag.
**Kein ``<abstimmung>``-Tag.** Vote-Daten muessen aus Reden + Kommentaren
extrahiert werden — gleiche Architektur wie NRW (Anchor-basiert), aber
mit ANDEREN Anchor-Phrasen.
### Vote-Anchor-Phrasen (vom NRW-Pattern abweichend!)
Bundestag-typisch:
- "Wer dem [Antrag/Gesetzentwurf] seine Zustimmung gibt, den bitte
ich, sich vom Platz zu erheben."
- "Damit ist [...] in zweiter Beratung angenommen."
- "Die Mehrheit hat den Gesetzentwurf [...] abgelehnt."
- "Wir kommen zur Abstimmung in dritter Lesung."
- "[...] wird zur federfuehrenden Beratung an den Ausschuss [...]
ueberwiesen."
**Achtung:** WP20-Sitzung 184 enthielt 0 dieser Anchors weil pure
Aussprache. Echtes Sample mit Beschluessen brauchts (z.B. Sitzungen
mit Gesetzentwurf-Lesungen).
### Strukturierte Alternative — namentliche Abstimmungen
Bundestag publiziert namentliche Abstimmungen separat als Excel/XML
unter ``bundestag.de/parlament/plenum/abstimmung/abstimmung``. Pro
Abstimmung MP-level Vote-Records. Fraktions-Aggregate sind dort
extrahierbar OHNE PDF-Parsing.
**Empfehlung fuer Implementer:** statt PDF/XML-Parser bauen, lieber
``app/abgeordnetenwatch.py`` (existiert) auf Fraktions-Aggregat-Form
runterrechnen — das deckt namentliche Abstimmungen sauber ab. Nur fuer
Hammelsprung-und-Handzeichen-Abstimmungen (nicht-namentlich) muss man
das XML-Plenum parsen.
### Sample-Daten fuer Tests
- WP20 Sitzung 30: "{wp}{n:03}" → btp/20/20030.xml — enthaelt diverse
Gesetzentwurf-Beschluesse
- Sitzungen mit "namentliche Abstimmung" laut Tagesordnung sind
Goldstandard fuer Tests
### Aufwand
Geschaetzt 1-2 Tage:
- 4h Reverse-Engineering der Anchor-Sprache (mehrere Sample-Sitzungen)
- 4h Parser-Implementierung
- 4h Tests (Fixture-Pinning analog NRW 19/19-Garantie)
Folge-Issue: https://repo.toppyr.de/tobias/gwoe-antragspruefer/issues/148
"""
from __future__ import annotations
def parse_protocol(pdf_or_xml_path: str) -> list[dict]:
"""STUB — siehe Modul-Docstring."""
raise NotImplementedError(
"BUND-Plenarprotokoll-Parser ist noch nicht implementiert. "
"Siehe app/protokoll_parsers/bund.py-Docstring fuer Recherche-Findings "
"und docs/protokoll-parser-roadmap.md."
)