CodeGym /Java Kurs /Python SELF DE /Daten aus komplexen HTML-Strukturen extrahieren

Daten aus komplexen HTML-Strukturen extrahieren

Python SELF DE
Level 34 , Lektion 0
Verfügbar

1. Grundlagen der Arbeit mit komplexen HTML-Strukturen

Bevor wir in die Analyse komplexer HTML-Markups einsteigen, ist es wichtig zu verstehen, warum HTML so verworren sein kann. Webentwickler verwenden oft komplexe verschachtelte Elemente, um Inhalte zu organisieren, was zu einem echten Albtraum werden kann, wenn man versucht, Daten von solchen Seiten zu extrahieren. Aber keine Sorge — mit einem guten Plan und den richtigen Tools schaffst du das problemlos!

HTML-Baumstruktur verstehen

Stell dir ein HTML-Dokument wie einen Baum vor: Jedes Element ist ein Knoten, der Text oder andere Knoten enthalten kann. An der Spitze dieses Baumes steht das html, gefolgt von head und body, und darunter sind verschiedene Kindelemente. Verschachtelte Elemente befinden sich tiefer in diesem Baum.

Beispiel für eine einfache HTML-Struktur:

HTML

<html>
  <head>
    <title>Beispiel</title>
  </head>
  <body>
    <div class="content">
      <h1>Überschrift</h1>
      <p>Absatz 1</p>
      <p>Absatz 2</p>
      <div class="nested">
        <ul>
          <li>Element 1</li>
          <li>Element 2</li>
          <li><span>Element 3</span></li>
        </ul>
      </div>
    </div>
  </body>
</html>

Wie du siehst, haben wir ein div mit der Klasse nested, welches ein ul enthält, das wiederum mit li gefüllt ist. Das ist ein Beispiel dafür, wie Elemente verschachtelt sein können.

2. BeautifulSoup zur Datenextraktion

Daten aus verschachtelten Elementen extrahieren

Erinnern wir uns, wie BeautifulSoup funktioniert. Lass uns BeautifulSoup verwenden, um Texte von li-Listen zu extrahieren. Zeit, ein echter Detektiv zu werden und Daten aus verschachtelten Strukturen zu sammeln.

Python

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
nested_items = soup.select('.nested ul li')

for item in nested_items:
    print(item.get_text())

Ergebnis:


Element 1
Element 2
Element 3

Wie du siehst, haben wir die Methode select mit einem CSS-Selektor verwendet, um alle li innerhalb des Elements mit der Klasse nested zu finden. Die Methode get_text() ermöglicht es, den Text direkt aus den gefundenen Elementen zu extrahieren.

3. Arbeit mit mehrstufigen Elementen

Manchmal befinden sich Daten nicht nur tief in der Struktur, sondern sind auch über verschiedene Ebenen verteilt, was die Extraktion erschwert. Lass uns herausfinden, wie man Daten aus komplexeren HTML-Bäumen extrahiert.

Beispiel einer komplexen Struktur:

HTML

<html>
  <body>
    <div class="wrapper">
      <div class="header">
        <h1>Das ist eine Überschrift</h1>
      </div>
      <div class="content">
        <div class="article">
          <h2>Artikel 1</h2>
          <p>Inhalt von Artikel 1</p>
        </div>
        <div class="article">
          <h2>Artikel 2</h2>
          <p>Inhalt von Artikel 2</p>
        </div>
      </div>
      <div class="footer">
        <p>Kontaktinformationen</p>
      </div>
    </div>
  </body>
</html>

Daten aus Ebenen extrahieren

Versuchen wir jetzt, die Titel aller Artikel und deren Inhalte zu extrahieren.

Python

articles = soup.select('.content .article')

for article in articles:
    title = article.find('h2').get_text()
    content = article.find('p').get_text()
    print(f'Titel: {title}')
    print(f'Inhalt: {content}\n')

Erwartete Ausgabe:


Titel: Artikel 1
Inhalt: Inhalt von Artikel 1

Titel: Artikel 2
Inhalt: Inhalt von Artikel 2

Wir nutzen eine Kombination aus den Methoden select und find, um unser Ziel zu erreichen. select hilft uns, das übergeordnete Element zu finden, während find Informationen aus den Kindelementen extrahiert.

4. Besonderheiten der Arbeit mit verschachtelten Elementen

Beim Betrachten von Webseiten kannst du auf Probleme wie mehrere verschachtelte Elemente mit denselben Klassen oder Tags stoßen. In solchen Fällen können kontextbezogene Suchen und eine klare Identifizierung der benötigten Elemente helfen, Fehler zu vermeiden.

Beispiel einer komplexen Verschachtelung:

HTML

<html>
  <body>
    <div class="container">
      <div class="item">
        <h2>Nummer 1</h2>
        <div class="details">Details 1</div>
      </div>
      <div class="item">
        <h2>Nummer 2</h2>
        <div class="details">Details 2</div>
        <div class="additional">
          <div class="info">Zusätzliche Informationen</div>
        </div>
      </div>
    </div>
  </body>
</html>

Daten unter Berücksichtigung der Verschachtelung extrahieren

Um Verwirrung zu vermeiden, solltest du spezifischere Elemente finden:

Python

items = soup.select('.container .item')

for item in items:
    number = item.find('h2').get_text()
    details = item.select_one('.details').get_text()
    additional_info = item.select_one('.additional .info')
    
    print(f'Nummer: {number}')
    print(f'Details: {details}')
    
    if additional_info:
        print(f'Zusätzliche Informationen: {additional_info.get_text()}')
    print()

Hier nutzen wir die Methode select_one, die nur das erste gefundene Element zurückgibt, um doppelte Daten aus zusätzlichen Blöcken zu vermeiden.

5. Praktische Aspekte und typische Fehler

Bei der Arbeit mit komplexen HTML-Strukturen ist es leicht, den Überblick zu verlieren oder auf Fehler zu stoßen. Ein typischer Fehler ist der Versuch, auf ein nicht vorhandenes Element zuzugreifen, was zu einem AttributeError führt. Um dies zu vermeiden, überprüfe immer das Vorhandensein eines Elements, bevor du damit arbeitest.

Eine weitere wichtige Sache ist, dass man nicht immer sofort alle Daten "auf Anhieb" extrahieren muss. Manchmal ist es nützlich, die Struktur vorläufig zu analysieren, Debug-Ausgaben zu verwenden und Zwischenergebnisse zu überprüfen.

In realen Projekten können Fähigkeiten im Umgang mit verschachtelten HTML-Strukturen entscheidend sein. Dies wird nicht nur im Web-Scraping angewendet, sondern auch beim Testen von Webinterfaces, der Automatisierung von Tests und sogar bei der Analyse von Daten aus komplexen APIs, wo die Ausgabe ein formatiertes, verschachteltes Antwortformat haben kann.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION