Nach mehreren Artikeln über das Abstimmungsverhalten im Grossen Rat von Basel-Stadt versuchte ich, dasselbe für den Baselbieter Landrat zu tun. Rasch zeigte sich, dass die Arbeit nur in geringem Masse reproduzierbar ist. Das Hauptproblem beim Landrat war, dass kein generelles Verzeichnis der Abstimmungsvorgänge vorhanden ist (wie etwa dieses in Basel: http://abstimmungen.grosserrat-basel.ch/index_archiv.php).
Der einzige Verweis auf die eigentlich praktisch unauffindbaren Dateien (gespeichert unter kryptischen Adressen wie https://www.baselland.ch/politik-und-behorden/landrat-parlament/sitzungen/traktanden-2010/landratssitzung-vom-5-12-19-november-2015/protokoll-der-landratssitzung-vom-5-12-u-143/protokoll-der-landratssitzung-vom-4-juni-2015/downloads/04-06-2015_11-36-06.pdf – man beachte die Sekundenzahl der Abstimmung!) findet sich in den Landratsprotokollen – zum Glück zumindest jeweils mit einem Link, der als „Namenliste“ (teilweise auch “ Namenliste“ oder „Namenliste “ oder “ Namenliste „) aufgeführt ist. Diese lassen sich mit meinen gängigen Methoden scraperwiki und simple_html_dom einfach und zuverlässig einlesen. Weil das Archiv (seit 2010) sehr umfangreich ist, habe ich eine Hilfsdatenbank verwendet und dort jeweils per reload ein Landratsprotokoll nach dem anderen eingelesen und die URL der einzelnen Protokoll-Abschnitte (insgesamt 3659) abgespeichert. In einem zweiten Durchlauf hat das Script sämtliche URLS geladen und nach [Namenliste]-Links durchsucht und diese in eine zweite DB abgespeichert. In einem dritten Schritt habe ich mit smalot/pdfparser den Inhalt der pdf-Dateien in die zweite DB geschrieben. Die Daten sind teilweise fehlerhaft – keine Ahnung, wie das geschehen kann – wird hier von Hand nachgebessert? So wurden „;“ vergessen und Namen als „Schweizer Hannes SP JSchweizer Kathrin“ eingegeben… Der Horror für jede Datenanalyse. Mit ziemlich viel Aufwand (>2 Stunden) konnte ich mit manuellen Korrekturen direkt in der DB die Fehler eliminieren. Auch waren einige PDF-Dateien grundsätzlich fehlerhaft abgespeichert und konnten auch im Browser nicht angezeigt werden. Bsp: https://www.baselland.ch/politik-und-behorden/landrat-parlament/sitzungen/traktanden-2010/landratssitzung-vom-22-oktober-2015/protokoll-der-landratssitzung-vom-22-okt-12/downloads/22-10-2015_14-44-58.pdf. Oder Dateien wie diese mit nur einem Namen: https://www.baselland.ch/politik-und-behorden/landrat-parlament/sitzungen/traktanden-2010/landratssitzungen-vom-22-29-september-2016/pdf-traktandenliste-22-und-29-september-2016/22-09-2016-15-32-02.pdf
In einer ersten Auswertung habe ich den Fokus auf die BüZa (Bürgerliche Zusammenarbeit) gelegt, insbesondere auf die umstrittene Rolle der CVP. Das eigentliche Ziel, die Wiederverwertbarkeit der Auswertungen auch für den Grossen Rat, musste ich vorerst auf Eis legen, werde es aber bei einer Überarbeitung oder Anpassung auf ein weiteres Kantonsparlament (mehr dazu bald) vorantreiben, denn die neu erstellte Auswertung ist kompakter und eleganter als die erste Version für den Basler Grossen Rat.
Zunächst habe ich die Auswahl der relevanten Geschäfte erstmals per SQL vorgenommen:
$alleeintraege = $wpdb->get_results( "SELECT * FROM lr_import where datetime > '2015-07-01 00:00:00'" );
Danach folgt eine erste Schlaufe zur Auswahl der relevanten Geschäfte und die komplizierte Aufspaltung in Geschäfte, bei denen die büza funktioniert und solchen, bei denen sie nicht funktionert:
foreach($resultatearrayganz as $zeile){ if($_GET["action"] == "cvp"){ //Array vorbereiten für die Rolle der CVP in der büza if($resultatearray["Partei"] == "Gruene" || $resultatearray["Partei"] == "SP"){ $geschaeft["rotgruen"][$resultatearray["Stimme"]]++; } if($resultatearray["Partei"] == "FDP" || $resultatearray["Partei"] == "SVP"){ $geschaeft["buergerliche"][$resultatearray["Stimme"]]++; } if($resultatearray["Partei"] == "CVP"){ $geschaeft["cvp"][$resultatearray["Stimme"]]++; array_push($cvp_politiker[$resultatearray["Stimme"]], $resultatearray["Name"]); $cvp_abweichler[$resultatearray["Name"]]["total"]++; } } //Auswertung, ob es sich um ein relevantes Geschäft handelt if($_GET["action"] == "cvp"){ //Die Rolle der CVP in der Büza untersuchen //1. war es eine Abstimmung mit geschlossenen Lagern (wenig Gegenstimmen/Enthaltungen sowohl bei rotgrün als auch bei bürgerlichen) if(abs($geschaeft["buergerliche"]["J"] - $geschaeft["buergerliche"]["N"]) > 20 && abs($geschaeft["rotgruen"]["J"] - $geschaeft["rotgruen"]["N"]) > 15){ //2. war die Abstimmung umstritten? if(abs($geschaeft["buergerliche"]["J"] - $geschaeft["rotgruen"]["J"]) > 20){ $ausgabetext = "<tr><td><a href=\"".$eintrag->url."\">".$eintrag->datetime."</a></td><td><a href=\"https://baselland.talus.ch/de/politik/cdws/geschaefte_data.php?volltext=&number=".$geschaeftnummer."&title=&typ=&year=&author=&partei=&state=&board=&committee=&pendent=&due=\" title=\"".$geschaeftstitel."\">".substr($geschaeftstitel,0,70)."</a></td><td>".(0+$geschaeft["buergerliche"]["J"]).":".(0+$geschaeft["buergerliche"]["N"])."</td><td>".(0+$geschaeft["rotgruen"]["J"]).":".(0+$geschaeft["rotgruen"]["N"])."</td><td>".(0+$geschaeft["cvp"]["J"]).":".(0+$geschaeft["cvp"]["N"])."</td></tr>"; //3. Doppelte Auswertung zur Rolle der CVP - funktioniert die Büza oder nicht? //3a: Sagen die Bürgerlichen Ja? if($geschaeft["buergerliche"]["J"] - $geschaeft["rotgruen"]["J"] > 20){ //3a1. die CVP sagt auch Ja = büza funktioniert if($geschaeft["cvp"]["J"] > $geschaeft["cvp"]["N"]){ $buezafunktioniert[substr($geschaeftstitel,0,70)]=$ausgabetext; foreach($cvp_politiker["N"] as $politiker){ $cvp_abweichler[$politiker]["abweichend"]++; } } //3a2. die CVP sagt nein = büza funktionier nicht else{ $buezafunktioniertnicht[substr($geschaeftstitel,0,70)]=$ausgabetext; foreach($cvp_politiker["N"] as $politiker){ $cvp_abweichler[$politiker]["abweichend"]++; } } } //3b: Die Bürgerlichen sagen nein else{ //3b1. die CVP sagt auch Nein = büza funktioniert if($geschaeft["cvp"]["J"] < $geschaeft["cvp"]["N"]){ $buezafunktioniert[substr($geschaeftstitel,0,70)]=$ausgabetext; foreach($cvp_politiker["J"] as $politiker){ $cvp_abweichler[$politiker]["abweichend"]++; } } //3a2. die CVP sagt Ja = büza funktionier nicht else{ $buezafunktioniertnicht[substr($geschaeftstitel,0,70)]=$ausgabetext; foreach($cvp_politiker["J"] as $politiker){ $cvp_abweichler[$politiker]["abweichend"]++; } } } }
Zur Ausgabe habe ich erstmals Javascript zum nachträglichen Sortieren der Tabelle eingefügt. Es heisst sorttable.js und wird folgendermassen eingebunden:
?> <script src="http://www.samuelhufschmid.ch/wp-content/themes/twentysixteen/js/sorttable.js"></script> <style type="text/css"> <!-- a:link { color: #000000; text-decoration: none} --> </style> <?php
In einer ersten Auswertung habe ich den Fokus auf die BüZa (Bürgerliche Zusammenarbeit) gelegt, insbesondere auf die umstrittene Rolle der CVP. Meine Kollegen aus der Landregion haben daraus einen spannenden Text gemacht, der online hier und im Print hier zu finden ist.