1. Navigation im HTML-Baum
Heute tauchen wir in die mysteriöse Welt der HTML-Bäume ein und lernen, wie wir Informationen von Webseiten extrahieren können wie echte Programmier-Ninjas. Wir werden weiterhin die magische Bibliothek BeautifulSoup nutzen, um an die benötigten Daten zu gelangen und unsere ohnehin schon cleveren Skripte noch vielseitiger zu machen. Also, macht eure Tastatur einsatzbereit, und los geht's!
Bevor wir uns an die Datenextraktion machen, lassen Sie uns noch einmal klären, was ein HTML-Baum ist. Stellen Sie sich das vor wie einen riesigen Familienstammbaum, bei dem jedes Tag ein einzelner Verwandter ist. Es gibt Eltern, Kinder, Geschwister. Unsere Aufgabe ist es, bestimmte "Verwandte" zu finden, um wertvolle Familienerbstücke (oder in unserem Fall Daten) von ihnen zu extrahieren.
So kann ein HTML-Stück aussehen:
<div class="article">
<h2 id="title">Überschrift</h2>
<p class="content">Das ist ein Artikeltext...</p>
<a href="https://example.com" class="link">Weiterlesen</a>
</div>
Hier haben wir ein div, das ein übergeordnetes Element für h2, p und a ist. Jedes von ihnen hat eigene Attribute und Inhalte.
2. Datenextraktion nach Tags
BeautifulSoup bietet praktische Methoden zur Navigation im Baum und zur Datenextraktion. Beginnen wir mit der grundlegenden Methode find(), mit der wir das erste Element mit einem bestimmten Tag finden können. Und dann gibt es noch find_all() – ein wahrer Such-Bulldozer, der alle Elemente mit einem bestimmten Tag ausgräbt.
from bs4 import BeautifulSoup
html_doc = """<div class="article">
<h2 id="title">Überschrift</h2>
<p class="content">Das ist ein Artikeltext...</p>
<a href="https://example.com" class="link">Weiterlesen</a>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
# Finden des ersten Paragraphen
first_paragraph = soup.find('p')
print(first_paragraph.text) # Ausgabe: Das ist ein Artikeltext...
# Finden aller Links
all_links = soup.find_all('a')
for link in all_links:
print(link['href']) # Ausgabe: https://example.com
3. Benutzung von Attributen zur Filterung von Elementen
Jetzt, da wir die Tag-Suche gemeistert haben, ist es an der Zeit, zu lernen, wie man Elemente mit Attributen wie id und class filtert. Diese Attribute sind wie Lesezeichen auf einer Seite, die direkt anzeigen, wo was zu finden ist.
<div class="article">
<h2 id="title">Überschrift</h2>
<p class="content">Das ist ein Artikeltext...</p>
<a href="https://example.com" class="link">Weiterlesen</a>
</div>
# Finden eines Elements mit einer bestimmten id
title = soup.find(id="title")
print(title.text) # Ausgabe: Überschrift
# Finden aller Elemente mit der Klasse "content"
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
print(p.text) # Ausgabe: Das ist ein Artikeltext...
Wichtig! Wir benutzen class_ statt class – das dient dazu, Konflikte mit dem reservierten Python-Schlüsselwort zu vermeiden.
4. Praxis: Datenextraktion mit bestimmten Bedingungen
Jetzt zur Praxis! Stellt euch vor, ihr müsst Links und Überschriften aus einem großen wiederholenden HTML-Array von Artikeln extrahieren. Hier ein Beispiel für die Daten und wie man mit ihnen arbeitet:
<div class="articles">
<div class="article">
<h2 class="title">Erster Artikel</h2>
<a href="https://example.com/1" class="read-more">Weiterlesen</a>
</div>
<div class="article">
<h2 class="title">Zweiter Artikel</h2>
<a href="https://example.com/2" class="read-more">Weiterlesen</a>
</div>
</div>
Und so können wir Überschriften und Links extrahieren:
html_doc = """<div class="articles">
<div class="article">
<h2 class="title">Erster Artikel</h2>
<a href="https://example.com/1" class="read-more">Weiterlesen</a>
</div>
<div class="article">
<h2 class="title">Zweiter Artikel</h2>
<a href="https://example.com/2" class="read-more">Weiterlesen</a>
</div>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
title = article.find('h2', class_='title').text
link = article.find('a', class_='read-more')['href']
print(f"Überschrift: {title}, Link: {link}")
# Ausgabe:
# Überschrift: Erster Artikel, Link: https://example.com/1
# Überschrift: Zweiter Artikel, Link: https://example.com/2
5. Über mögliche Stolpersteine
Jetzt, wo du mit Wissen ausgerüstet bist, lasst uns ein paar typische Fehler betrachten. Einer der häufigsten Probleme – der Versuch, auf ein Attribut zuzugreifen, das nicht existiert. Dafür antwortet Python freundlich, aber dennoch ärgerlich mit einem KeyError. Um dem aus dem Weg zu gehen, kannst du die Methode .get() benutzen, um Attribute mit einem Standardwert abzurufen, falls sie fehlen.
Vergiss außerdem nicht die HTML-Elemente, die verschachtelt und mit einer komplexen Struktur versehen sein können. Nutze die Funktion zum Anzeigen des Quellcodes der Seite in deinem Browser, um sicherzustellen, dass du die Struktur richtig verstehst, bevor du versuchst, Daten mit BeautifulSoup zu extrahieren.
Die nächste Station in unserem aufregenden Abenteuer wird die Anwendung von CSS-Selektoren sein, um noch genauer zu zielen und Informationen zu extrahieren. Bleibt also dran, denn das Abenteuer in der Welt von BeautifulSoup fängt gerade erst an!
GO TO FULL VERSION