# Adapter-Capabilities: Vergleichsmatrix Stand: 2026-04-10. Automatisch aus `parlamente.py` + `bundeslaender.py` extrahiert. ## Übersicht 16 Bundesländer + Bundestag, alle aktiv. | BL | Adapter | WP | Suche | Fuzzy | Typ-Filter | API | |---|---|---|---|---|---|---| | **BUND** | BundestagAdapter | 21 | Server (DIP REST) + Title-Filter | Nein | Server (`f.drucksachetyp`) | REST JSON | | **NRW** | NRWAdapter | 18 | Server (HTML-Form) + AND-Filter | Nein | Server (`dokTyp`) | HTML POST | | **LSA** | PortalaAdapter | 8 | Server (eUI) + Title-Filter | Nein | Server (`ETYPF=Antrag`) | eUI 2-Step | | **BE** | PortalaAdapter | 19 | Server (eUI, 730d-Fenster) + Title-Filter | Nein | Client-only | eUI 2-Step | | **BB** | PortalaAdapter | 8 | Server (eUI) + Title-Filter | Nein | Server (`ETYPF=Antrag`) | eUI 2-Step | | **RP** | PortalaAdapter | 18 | Server (eUI) + Title-Filter | Nein | Server (`ETYPF=Antrag`) | eUI 2-Step | | **MV** | ParLDokAdapter | 8 | Server (ParlDok JSON) + Typ-Filter | Nein | Client (`type=="Antrag"`) | REST JSON | | **HH** | ParLDokAdapter | 23 | Server (ParlDok JSON) + Typ-Filter | Nein | Client (`type=="Antrag"`) | REST JSON | | **TH** | ParLDokAdapter | 8 | Server (ParlDok JSON) + Typ-Filter | Nein | Client (Substring `"Antrag"` in type) | REST JSON | | **SH** | StarFinderCGI | 20 | Server (CGI, `dtyp=antrag`) + Title-Filter | Nein | Server (`dtyp`) | Legacy CGI | | **HE** | StarWebHEAdapter | 21 | Server (eUI, VTDRS) + Title+Typ-Filter | Nein | Client (`"antrag"` in typ) | eUI 2-Step | | **HB** | PARiSHBAdapter | 21 | Server (PARiS-Servlet) + Typ-Filter | Nein (Thesaurus only) | Client (`"antrag"` in typ) | HTML POST | | **BW** | PARLISAdapter | 17 | Server (eUI, async Polling) + Title-Filter | Nein | Server (`lines.l4=Antrag`) | eUI async | | **BY** | BayernAdapter | 19 | **Server-Volltext (Solr)** + Typ-Filter | **Ja (Solr)** | Client (`typ=="antrag"`) | HTML Scraping | | **SL** | SaarlandAdapter | 17 | **Server-Volltext (Umbraco)** + Typ-Filter | Umbraco-Relevanz | Client (`DocumentType`) | REST JSON | | **SN** | SNEdasXmlAdapter | 8 | Statisch (manueller XML-Export) + Title-Filter | Nein | N/A | XML Import | ## Such-Architekturen ### Volltext-Suche server-seitig Nur **BY** (TYPO3-Solr) und **SL** (Umbraco) bieten echte Volltextsuche über den gesamten Dokumentkorpus. Alle anderen filtern entweder nur den Titel client-seitig oder nutzen eingeschränkte Server-Filter (WP + Datum). ### Client-seitige Title-Filterung Die Mehrheit (portala/eUI, ParlDok, StarFinder, BUND) holt einen breiten Satz von Treffern nach WP/Datum/Typ und filtert dann im Python-Code per `all(t in title.lower() for t in query_terms)`. Das bedeutet: - **Nur Titel-Matches** — Inhalte der Drucksachen werden nicht durchsucht - **AND-Logik** — alle Suchbegriffe müssen im Titel vorkommen - **Keine Fuzzy-Toleranz** — Tippfehler oder Synonym-Drift werden nicht abgefangen - **Performance ok** — max. 1000-1500 Treffer pro Request (via chunksize) ### Sonderfälle | BL | Besonderheit | |---|---| | **SN** | Kein Scraping möglich (`robots.txt`); manueller wöchentlicher XML-Export aus EDAS | | **BE** | `document_type=None` weil Berlin's ETYPF andere Values nutzt; 730-Tage-Fenster als Workaround | | **TH** | Anträge heißen "Antrag gemäß § 79 GO" → Substring-Match statt Exact-Match; `kinds=["Drucksache", "Vorlage"]` | | **BW** | Async 2-Step mit Search-ID-Polling (2-15 Versuche × 2s Pause), JSON-in-HTML-Comments | | **HE** | Perl-Data::Dumper in HTML-Comments, Hex-Escape-Decoding (`\x{e9}` → `é`) | | **NI** | ❌ **Nicht implementiert** — NILAS-StarWeb braucht Session-Cookie, HAR-Capture nötig | ## Feld-Mapping: Woher kommen die Daten? Pro Adapter: welches API-Feld wird zu welchem Drucksache-Feld, mit Beispiel. ### NRW (NRWAdapter — OPAL HTML) | Feld | Quelle | Beispiel | |---|---|---| | title | HTML `.e-document-result-item__title` `` Text | "Kostenloses Parken für E-Fahrzeuge aufheben" | | datum | `
` → Regex | "19/3104" | | link | `` (http→https, relativ→absolut) | `https://pardok.parlament-berlin.de/...` | | typ | `
` vor Fraktionsnamen | "Antrag", "Vorlage" | ### MV / HH / TH (ParLDokAdapter — JSON-API) | Feld | Quelle (JSON-Feld) | Beispiel | |---|---|---| | title | `title` | "Weiterbildungsförderung" | | datum | `date`, DD.MM.YYYY → ISO | "15.03.2026" → "2026-03-15" | | fraktionen | `authorhtml` → `extract_fraktionen()` | "Klaus Meyer (CDU)" → `["CDU"]` | | drucksache | `f"{lp}/{number}"` | lp=8, number=1594 → "8/1594" | | link | `{base_url}{prefix}{link}` (Fragment `#navpanes=0` gestrippt) | `https://dokumentation.landtag-mv.de/parldok/dokument/8` | | typ | `type` (TH: Substring-Match auf "Antrag") | "Antrag", "Antrag gemäß § 79 GO" | ### SH (StarFinderCGIAdapter — Legacy CGI) | Feld | Quelle (HTML-Regex) | Beispiel | |---|---|---| | title | `` in Tabellenzeile | "Energiewende vorantreiben" | | datum | Nach ``, DD.MM.YYYY → ISO | "07.04.2026" → "2026-04-07" | | fraktionen | Urheber-Text → `extract_fraktionen()` | "Christian Dirschauer (SSW)" → `["SSW"]` | | drucksache | `` Text | "20/5136" | | link | `` direkt | `http://lissh.lvn.parlanet.de/.../20-5136.pdf` | | typ | Fest: "Antrag" (server-side `dtyp=antrag`) | "Antrag" | ### HE (StarWebHEAdapter — eUI Perl-Dump) | Feld | Quelle (Perl-Dump-Feld) | Beispiel | |---|---|---| | title | `WEV01[0].main` (Hex-Escape-Decoding `\x{e9}` → `é`) | "Schulinfrastruktur modernisieren" | | datum | `WEV02[0].main`, DD.MM.YYYY → ISO | "29.02.2026" → "2026-02-29" | | fraktionen | `WEV12[0].main` → `extract_fraktionen()` | "Klaus Dieter (GRÜNE)" → `["GRÜNE"]` | | drucksache | `WEV08[0].main` | "21/8532" | | link | `WEV07[0].main` (http→https) | `https://starweb.hessen.de/.../21_8532.pdf` | | typ | `WEV03[0].main` | "Antrag", "Antrag mit Änderung" | ### HB (PARiSHBAdapter — Java-Servlet HTML) | Feld | Quelle (HTML-Regex) | Beispiel | |---|---|---| | title | `

` | "Bremenpass für Kultur" | | datum | Nach Drucksache, DD.MM.YYYY → ISO | "23.02.2026" → "2026-02-23" | | fraktionen | Nach Datum → `extract_fraktionen()` | "SPD, BÜNDNIS 90/DIE GRÜNEN, Die Linke" → `["SPD", "GRÜNE", "LINKE"]` | | drucksache | `Drs 21/730` + optionaler Suffix (S/L) | "21/730", "21/730S" | | link | `` | `https://www.bremische-buergerschaft.de/.../21/730.pdf` | | typ | Regex vor Datum | "Antrag", "Änderungsantrag" | ### BW (PARLISAdapter — eUI async Polling, JSON-in-HTML) | Feld | Quelle (Perl/JSON-Feld) | Beispiel | |---|---|---| | title | `WMV33` (Schlagworte, `` gestrippt) / Fallback `EWBV23` | "Energiewirtschaft; Stromversorgung" | | datum | `EWBV23` → Regex DD.MM.YYYY → ISO | "16.03.2026" → "2026-03-16" | | fraktionen | `WMV30` (Kurz-Urheber) → `extract_fraktionen()` | "Felix Herkens (GRÜNE) u. a." → `["GRÜNE"]` | | drucksache | `EWBV22` oder `EWBD01` → Regex | "17/10323" | | link | `EWBD05[0].main` (direkte PDF-URL) | `https://parlis.landtag-bw.de/.../17_10323.pdf` | | typ | Fest: `document_typ="Antrag"` (in `lines.l4`) | "Antrag" | ### BY (BayernAdapter — TYPO3-Solr HTML) | Feld | Quelle (HTML-Regex) | Beispiel | |---|---|---| | title | `
` | "Kostenloses Parken für E-Fahrzeuge aufheben" | | datum | `

` "Drucksache Nr. 19/11407 vom 08.04.2026" DD.MM.YYYY → ISO | "08.04.2026" → "2026-04-08" | | fraktionen | `

` "Antrag AfD" → `extract_fraktionen()` | "Antrag CSU, FREIE WÄHLER" → `["CSU", "FW-BAYERN"]` | | drucksache | `

` Regex | "19/11407" | | link | `` (absolute URL) | `https://www.bayern.landtag.de/.../0000009107.pdf` | | typ | Erstes Wort aus `

` | "Antrag" | ### SL (SaarlandAdapter — Umbraco JSON) | Feld | Quelle (JSON-Feld) | Beispiel | |---|---|---| | title | `Title` | "Schule als Lern- und Bildungsort weiter stärken" | | datum | `PublicDate` ISO-Format, erste 10 Zeichen | "2022-05-12T00:00:00" → "2022-05-12" | | fraktionen | `Publisher` + `DocumentAuthor` → `extract_fraktionen()` | Publisher "CDU" → `["CDU"]` | | drucksache | `DocumentNumber` | "17/11" | | link | `FilePath` mit `/file.ashx` → `/Downloadfile.ashx` Rewrite | `https://www.landtag-saar.de/Downloadfile.ashx?FileId=14230&FileName=Ag17_0011.pdf` | | typ | `DocumentType` | "Antrag", "Anfrage", "Gesetzentwurf" | ### SN (SNEdasXmlAdapter — Manueller XML-Export) | Feld | Quelle (XML-Element) | Beispiel | |---|---|---| | title | `` (CDATA) | "Geschäftsordnung des Sächsischen Landtags" | | datum | `` → Regex "datum"-Gruppe, DD.MM.YYYY → ISO | "01.10.2024" → "2024-10-01" | | fraktionen | `` → Regex "urheber"-Gruppe → `extract_fraktionen()` | "CDU, BSW, SPD" → `["CDU", "BSW", "SPD"]` | | drucksache | `f"{Wahlperiode}/{Dokumentennummer}"` | "8/2" | | link | Konstruiert: `.../viewer.aspx?dok_nr={nr}&dok_art=Drs&leg_per={wp}` (PDF wird on-demand aus Iframe gelöst) | `https://edas.landtag.sachsen.de/.../viewer.aspx?dok_nr=2&dok_art=Drs&leg_per=8` | | typ | Fest: "Antrag" | "Antrag" | ### BUND (BundestagAdapter — DIP REST-API) | Feld | Quelle (JSON-Feld) | Beispiel | |---|---|---| | title | `titel` | "Förderung von Genossenschaften im sozialen Bereich" | | datum | `datum` (bereits ISO YYYY-MM-DD) | "2026-04-08" | | fraktionen | `urheber[*].titel` → `extract_fraktionen()` | "Fraktion der AfD" → `["AfD"]` | | drucksache | `dokumentnummer` | "21/5136" | | link | `fundstelle.pdf_url` | `https://dip.bundestag.de/documents/btd/21/051/2105136.pdf` | | typ | `drucksachetyp` (server-side gefiltert) | "Antrag" | ## Gemeinsames Pattern Alle Adapter normalisieren Fraktionen über den zentralen `parteien.extract_fraktionen(text, bundesland=...)` Mapper (#55). Alle konvertieren DE-Datumsformat (DD.MM.YYYY) nach ISO (YYYY-MM-DD), außer BUND (schon ISO) und SL (schon ISO mit T-Suffix). ## Historien-Tiefe (ältere WPs) Alle Adapter sind aktuell auf **eine feste Wahlperiode** konfiguriert. Keiner unterstützt Queries über mehrere WPs hinweg. Ältere Drucksachen aus früheren WPs sind nicht abrufbar ohne Adapter-Rekonfiguration. Für eine künftige Multi-WP-Suche müsste pro Adapter geprüft werden, ob das Backend WP-übergreifende Queries unterstützt: | API-Typ | Multi-WP möglich? | |---|---| | portala/eUI | Ja (WP-Term aus dem JSON-Tree weglassen) | | ParlDok | Ja (`facet_lp` weglassen) | | StarFinder/PARiS | Ja (WP-Param weglassen) | | TYPO3-Solr (BY) | Ja (`wahlperiodeid[]` weglassen) | | DIP-API (BUND) | Ja (`f.wahlperiode` weglassen) | | Umbraco (SL) | Ja (`Filter.Periods=[]`) | | EDAS-XML (SN) | Nur innerhalb des exportierten Datenbestands | ## Fehlende Adapter | BL | Status | Blocker | |---|---|---| | **NI** (Niedersachsen) | Issue #22 offen | NILAS-StarWeb erfordert Session-Cookie, HAR-Capture vom User nötig |