Created
December 11, 2025 22:57
-
-
Save dewomser/d0ae9f2ec1a6c6b697299058ae95cab8 to your computer and use it in GitHub Desktop.
AFD Politiker und Funktionen aus Worms von der Webseite gekratzt im JSON Format
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| [ | |
| { | |
| "name": "Frank Kienitz", | |
| "functions": [ | |
| "Mitglied der AfD seit 2023", | |
| "Mitglied im AfD Kreisvorstand seit 2024", | |
| "Mitglied im Stadtrat", | |
| "Mitglied im Stadtrat Worms seit 2023" | |
| ] | |
| }, | |
| { | |
| "name": "Gabi Lehmann", | |
| "functions": [ | |
| "Mitglied im Stadtrat", | |
| "Mitglied im Stadtrat Worms seit 2024", | |
| "Parteiloses Fraktionsmitglied" | |
| ] | |
| }, | |
| { | |
| "name": "Heribert Friedmann", | |
| "functions": [ | |
| "Fraktionsvorsitzender", | |
| "Mitglied der AfD Worms seit 2013", | |
| "Mitglied des Landtages von 2016 – 2021", | |
| "Mitglied im Landesvorstand der AfD von 2015 – 2020", | |
| "Mitglied im Stadtrat Worms seit 2019" | |
| ] | |
| }, | |
| { | |
| "name": "Jörg Machauer", | |
| "functions": [ | |
| "Mitglied im Stadtrat", | |
| "Mitglied im Stadtrat Worms seit 2024", | |
| "Mitglied in der AfD seit 2023" | |
| ] | |
| }, | |
| { | |
| "name": "Lutz Hasselwander", | |
| "functions": [ | |
| "Mitglied Kreisvorstand Pirmasens (3 Jahre)", | |
| "Mitglied der AfD seit 2016", | |
| "Mitglied im Kreisvorstand Worms seit 2019", | |
| "Mitglied im Stadtrat", | |
| "Mitglied im Stadtrat Worms seit 2019" | |
| ] | |
| }, | |
| { | |
| "name": "Matthias Geithner", | |
| "functions": [ | |
| "Fraktionsgeschäftsführer", | |
| "Mitglied der AfD seit 2023", | |
| "Mitglied im AfD Kreisvorstand Worms seit 2024", | |
| "Mitglied im Stadtrat Worms seit 2024" | |
| ] | |
| }, | |
| { | |
| "name": "Thorsten Endreß", | |
| "functions": [ | |
| "Mitglied der AfD seit 2018", | |
| "Mitglied im AfD Kreisvorstand Worms seit 2024", | |
| "Mitglied im Stadtrat Worms seit 2024", | |
| "Stellv. Fraktionsvorsitzender" | |
| ] | |
| } | |
| ] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import subprocess | |
| from bs4 import BeautifulSoup | |
| import json | |
| def fetch_html_with_curl(url): | |
| """ | |
| Ruft den HTML-Inhalt von einer gegebenen URL mit curl ab. | |
| """ | |
| try: | |
| headers = { | |
| 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' | |
| } | |
| result = subprocess.run( | |
| ['curl', '-A', headers['User-Agent'], '-L', url], | |
| capture_output=True, | |
| text=True, | |
| check=True | |
| ) | |
| return result.stdout | |
| except (subprocess.CalledProcessError, FileNotFoundError) as e: | |
| print(f"Fehler beim Abrufen von {url} mit curl: {e}") | |
| return None | |
| def parse_afd_fraktion(html_content): | |
| """ | |
| Parst die HTML-Inhalte der AfD-Fraktions-Seite. | |
| """ | |
| if not html_content: | |
| return [] | |
| soup = BeautifulSoup(html_content, 'html.parser') | |
| politicians = [] | |
| # Jeder Fraktionsmitglied ist in einem 'eut-column-inner' div. | |
| # Wir wählen diese Spalten aus, um die Informationen zu extrahieren. | |
| member_columns = soup.select('.eut-column-inner.wpb_column.eut-column-1-3') | |
| for column in member_columns: | |
| name_tag = column.select_one('h3.eut-title span') | |
| role_tag = column.select_one('h4.eut-link-text span') | |
| if not name_tag: | |
| continue | |
| name = name_tag.get_text(strip=True) | |
| functions = [] | |
| if role_tag: | |
| role = role_tag.get_text(strip=True) | |
| if role: | |
| functions.append(role) | |
| # Extrahieren des politischen Werdegangs | |
| werdegang_div = column.select_one('.eut-text') | |
| if werdegang_div: | |
| list_items = werdegang_div.select('ul li') | |
| for item in list_items: | |
| # Fügt den bereinigten Text des Listenelements hinzu | |
| item_text = item.get_text(strip=True) | |
| if item_text: | |
| functions.append(item_text) | |
| if name: | |
| # Entferne Duplikate in den Funktionen und sortiere sie | |
| unique_functions = sorted(list(set(functions))) | |
| politicians.append({"name": name, "functions": unique_functions}) | |
| return sorted(politicians, key=lambda x: x["name"]) | |
| def main(): | |
| """ | |
| Hauptfunktion des Skripts. | |
| """ | |
| fraktion_url = "https://www.afd-worms.de/fraktion/" | |
| output_filename = "afd_politiker_worms.json" | |
| print(f"Rufe HTML von {fraktion_url} ab...") | |
| html_content = fetch_html_with_curl(fraktion_url) | |
| if not html_content: | |
| print("Konnte die Webseite nicht abrufen. Das Skript wird beendet.") | |
| return | |
| print("Parse Fraktions-Daten...") | |
| fraktion_data = parse_afd_fraktion(html_content) | |
| # Schreibe die Daten in eine JSON-Datei | |
| try: | |
| with open(output_filename, 'w', encoding='utf-8') as f: | |
| json.dump(fraktion_data, f, ensure_ascii=False, indent=2) | |
| print(f"Erfolgreich {output_filename} erstellt.") | |
| except IOError as e: | |
| print(f"Fehler beim Schreiben der Datei {output_filename}: {e}") | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment