6.3. 🏆Selbsttest: Wissen und Praxis#
Hinweis
Diese Übungsaufgaben dienen Ihrer Selbsteinschätzung und helfen Ihnen, das im Kapitel Gelernte zu reflektieren.
Sie können die Fragen in beliebiger Reihenfolge beantworten und auch mehrfach versuchen.
So funktioniert es:
Wählen Sie bei jeder Frage die Antwort(en), die Sie für richtig halten
Lesen Sie das Feedback zu den einzelnen Antwortoptionen sorgfältig durch
Die Erklärungen helfen Ihnen, Ihr Verständnis zu vertiefen – auch bei korrekten Antworten
Es erfolgt keine Bewertung oder Speicherung Ihrer Ergebnisse. Nutzen Sie dieses Assessment, um Wissenslücken zu identifizieren und gegebenenfalls die entsprechenden Abschnitte des Kapitels noch einmal zu bearbeiten.
Geschätzte Zeit: XX
Viel Erfolg!
6.3.1. Frage 1#
6.3.2. Frage 2#
6.3.3. Frage 3#
6.3.4. Frage 4#
6.3.5. Frage 5#
6.3.6. Frage 6#
6.3.7. Frage 7#
Szenario: Sie untersuchen eine Nachrichten-Website und finden folgende HTML-Struktur auf der Übersichtsseite:
<table>
<tbody>
<tr>
<td>15.01.2024</td>
<td><a href="/artikel/12345.html">Neuer Stadtrat gewählt</a></td>
<td>Rathaus</td>
</tr>
<tr>
<td>14.01.2024</td>
<td><a href="/artikel/12344.html">Haushalt beschlossen</a></td>
<td>Finanzen</td>
</tr>
</tbody>
</table>
Aufgaben:
Welchen CSS-Selektor würden Sie verwenden, um alle Tabellenzeilen zu finden?
Wie würden Sie aus einer Zeile das Datum, den Titel und den Link extrahieren?
Wie würden Sie aus dem relativen Link “/artikel/12345.html” eine vollständige URL machen?
Welche Metadaten würden Sie für jeden Artikel erfassen?
Musterlösung
Musterlösung:
1. CSS-Selektor für Tabellenzeilen:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_string)
rows = soup.select("table tbody tr")
# oder: soup.select("tbody tr")
# oder: soup.find_all("tr")
Erklärung:
table tbody tr: Findet alle<tr>-Elemente innerhalb von<tbody>innerhalb von<table>Spezifischer Selektor verhindert Fehlextr aktionen
select()gibt eine Liste aller passenden Elemente zurück
2. Extraktion von Datum, Titel und Link:
for tr in rows:
# Alle Zellen der Zeile holen
cells = tr.find_all("td")
# Sicherheitscheck
if len(cells) < 3:
continue
# Datum aus erster Zelle
datum = cells[0].get_text(strip=True)
# Titel und Link aus zweiter Zelle
anchor = cells[1].find("a", href=True)
if anchor:
titel = anchor.get_text(strip=True)
relative_url = anchor["href"] # oder: anchor.get("href")
# Quelle aus dritter Zelle
quelle = cells[2].get_text(strip=True)
Wichtige Methoden:
find_all("td"): Findet alle Zellenget_text(strip=True): Extrahiert Text, entfernt Leerzeichenfind("a", href=True): Findet Link, nur wenn href vorhandenanchor["href"]: Zugriff auf Attribut
3. Relative zu absoluter URL:
Methode A: Manuelle Konkatenation
base_url = "https://www.nachrichtenportal.de"
relative_url = "/artikel/12345.html"
vollstaendige_url = base_url + relative_url
# Ergebnis: "https://www.nachrichtenportal.de/artikel/12345.html"
Methode B: urllib.parse.urljoin (empfohlen)
from urllib.parse import urljoin
base_url = "https://www.nachrichtenportal.de"
relative_url = "/artikel/12345.html"
vollstaendige_url = urljoin(base_url, relative_url)
# Ergebnis: "https://www.nachrichtenportal.de/artikel/12345.html"
Vorteil von urljoin:
Behandelt verschiedene URL-Formate korrekt
Berücksichtigt Protokoll und Domain
Funktioniert auch mit vollständigen URLs (gibt sie unverändert zurück)
4. Zu erfassende Metadaten:
Essentiell:
ID: Eindeutige Kennung (z.B. aus URL: “12345”)
URL: Vollständige Artikel-URL
Datum: Veröffentlichungsdatum (“15.01.2024”)
Titel: Artikelüberschrift (“Neuer Stadtrat gewählt”)
Quelle: Ressort/Abteilung (“Rathaus”)
Zusätzlich empfohlen:
Dateiname (HTML): Wo wurde das Original gespeichert
Dateiname (TXT): Wo wurde der bereinigte Text gespeichert
Scraping-Zeitpunkt: Wann wurde der Artikel erfasst
Text-Länge: Anzahl Tokens/Wörter (für Analysen)
HTTP-Status: War der Abruf erfolgreich
Speicherformat (CSV):
DC.identifier,DC.source,DC.date,DC.title,DC.publisher,html_file,txt_file,scraped_at,n_tokens
12345,https://...,15.01.2024,Neuer Stadtrat gewählt,Rathaus,12345.html,12345.txt,2024-01-20,385
12344,https://...,14.01.2024,Haushalt beschlossen,Finanzen,12344.html,12344.txt,2024-01-20,412
Code-Beispiel:
records = []
for tr in rows:
cells = tr.find_all("td")
if len(cells) < 3:
continue
datum = cells[0].get_text(strip=True)
anchor = cells[1].find("a", href=True)
if not anchor:
continue
titel = anchor.get_text(strip=True)
relative_url = anchor["href"]
quelle = cells[2].get_text(strip=True)
# ID aus URL extrahieren
uid = relative_url.split("/")[-1].split(".")[0] # "12345"
# Vollständige URL
vollstaendige_url = urljoin(base_url, relative_url)
# Metadaten sammeln
records.append({
'DC.identifier': uid,
'DC.source': vollstaendige_url,
'DC.date': datum,
'DC.title': titel,
'DC.publisher': quelle,
'html_file': f"{uid}.html",
'txt_file': f"{uid}.txt"
})
In CSV speichern:
import pandas as pd
df = pd.DataFrame(records)
df.to_csv('metadata.csv', index=False, encoding='utf-8')