94 lines
3.2 KiB
Python
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."
|
||
|
|
)
|