Von HTML zu CSV: Veranstaltungsinformationen sammeln

Veranstaltungsinformationen mit BeautifulSoup und Pandas extrahiert und aufbereitet.
Lernziele
  • Lernen, wie man spezifische HTML-Elemente extrahiert. Anwendung von Selektoren zur gezielten Extraktion von Text aus HTML-Elementen wie <h2 class="teaser__title">, <p class="teaser__subtitle">, usw.
  • Verstehen, wie man Informationen über Veranstaltungen in der politischen Bildung in Brandenburg sammelt und analysiert, um sie für weiterführende Projekte oder Studien zu nutzen.

# bundeszentrale für politische bildung bietet RSS für veranstaltungen https://www.bpb.de/die-bpb/ueber-uns/service/rss/
# an anderer stelle kommt bei fehlen von RSS oder API, scraping in betracht
# view-source:https://www.politische-bildung-brandenburg.de/veranstaltungen?page=2
# prompt: bitte extrahiere alle article elemente aus dem html dokument und extrahiere den text der folgenden element in jedem article element : <h2 class="teaser__title">
# <p class="teaser__subtitle">
# <p class="teaser__meta">
# <p class="teaser__kicker">
# <p class="teaser__data">

import requests
from bs4 import BeautifulSoup

url = "https://www.politische-bildung-brandenburg.de/veranstaltungen"

extracted_data = []

for page in range(1, 10):
    url = f"https://www.politische-bildung-brandenburg.de/veranstaltungen?page={page}"
    try:
        response = requests.get(url)
        response.raise_for_status()

        soup = BeautifulSoup(response.content, "html.parser")

        articles = soup.find_all("article")


        for article in articles:
            title = article.find("h2", class_="teaser__title")
            subtitle = article.find("p", class_="teaser__subtitle")
            meta = article.find("p", class_="teaser__meta")
            date = article.find("p", class_="teaser__kicker")
            location = article.find("p", class_="teaser__data") # corrected class name

            extracted_data.append({
                "title": title.text.strip() if title else None,
                "subtitle": subtitle.text.strip() if subtitle else None,
                "meta": meta.text.strip() if meta else None,
                "date": date.text.strip() if date else None,
                "location": location.text.strip() if location else None
            })

        print(url, len(articles))
        if len(articles) == 0:
            break

    except requests.exceptions.RequestException as e:
        print(f"An error occurred during the request: {e}")
    except Exception as e:
        print(f"An error occurred during processing: {e}")
import pandas as pd

df = pd.DataFrame(extracted_data)
df.to_csv("extracted_events.csv")
pd.read_csv("extracted_events.csv", index_col=0)