Zum Inhalt

Welche BeautifulSoup-Alternativen für die HTML-Analyse in Python gibt es?

Als Python-Entwickler kennen Sie wahrscheinlich BeautifulSoup (auch bekannt als BS4) – die ehrwürdige HTML/XML-Parsing-Bibliothek, die seit über einem Jahrzehnt ein fester Bestandteil des Python-Web-Scrapings ist.

Aber Sie wissen vielleicht nicht, dass Beautiful Soup heutzutage bei weitem nicht die einzige Option zum Parsen von HTML in Python ist. Tatsächlich gibt es überraschend viele leistungsfähige BeautifulSoup-Alternativen, die in einigen Fällen sogar BS4 in Funktionalität und Leistung übertreffen.

In diesem umfassenden Leitfaden erkunden wir einige der beliebtesten und leistungsstärksten BeautifulSoup-Alternativen für das HTML-Scraping und -Parsing mit Python.

Warum sollten Sie BeautifulSoup-Alternativen in Betracht ziehen?

Bevor Sie sich mit den Optionen befassen, fragen Sie sich vielleicht: Warum überhaupt Alternativen in Betracht ziehen?

Hier sind einige Gründe, warum Sie für Ihre Python-Web-Scraping-Projekte über BeautifulSoup hinausblicken sollten:

  • Bessere Leistung – Einige neuere Parser übertreffen BS4 in Benchmarks deutlich. Geschwindigkeit ist beim Scraping großer Websites von entscheidender Bedeutung.

  • Mehr Funktionen – Bibliotheken wie lxml bieten zusätzliche Funktionen wie XPath-Unterstützung.

  • Besseres HTML5-Parsing – BeautifulSoup kann gelegentlich Probleme mit fehlerhaftem und modernem HTML haben.

  • Einfachere APIs – Bibliotheken wie Parsel bieten intuitivere Python-APIs.

  • Multi-Threading – Einige alternative Parser ermöglichen Multithread-Analyse, um die Vorteile mehrerer CPU-Kerne zu nutzen.

  • Einhaltung von Standards – Möglicherweise benötigen Sie einen Parser, der sich strikt an die HTML-Spezifikation hält.

  • Einfachere Installation – BS4 weist einige C-Abhängigkeiten auf, die zu Installationsproblemen führen können, insbesondere auf eingeschränkten Systemen wie AWS Lambda. Alternativen mit reinem Python-Code lassen sich einfacher bereitstellen.

Auch wenn BS4 nach wie vor eine gute Wahl ist, sind auch andere hervorragende Optionen eine Überlegung wert. Werfen wir einen Blick auf einige der besten BeautifulSoup-Alternativen für HTML-Parsing und Web-Scraping in Python!

lxml – Schnell wie der Blitz

Eine der beliebtesten und leistungsstärksten BeautifulSoup-Alternativen ist lxml. Die lxml-Bibliothek bietet eine extrem schnelle, funktionsreiche API zum Parsen von HTML und XML mit Python.

In Benchmarks übertrifft lxml BeautifulSoup durchweg deutlich deutlich. Das ist nicht ungewöhnlich 10-100-fache Geschwindigkeitsverbesserungen wenn lxml für die HTML-Analyse anstelle von BeautifulSoup verwendet wird.

Dies macht lxml zu einem unverzichtbaren Werkzeug für alle, die große Websites durchsuchen oder riesige HTML-Dokumente analysieren. Durch die Geschwindigkeitsvorteile können Sie Markups viel effizienter analysieren und die Kosten für Scraping mit hohem Thread-Gehalt senken.

Einige wichtige Vorteile von lxml:

  • Rasante XML- und HTML-Parsing-Geschwindigkeit
  • Unterstützung für sehr große Dokumente
  • XPath 1.0-Unterstützung für anspruchsvolle Abfragen
  • Unterstützung für CSS-Selektoren ähnlich wie bei BeautifulSoup
  • Einfacheres Threading – lxml gibt die GIL frei und ermöglicht so Multithread-Analyse
  • Unterstützung für HTML5-Parsing

Lassen Sie uns ein kurzes Beispiel durchgehen, um lxml in Aktion zu sehen:

from lxml import html
import requests

page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)

# Get headlines 
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)

print(headings)

Dieses einfache Beispiel demonstriert die Geschwindigkeit von lxml – es kann eine vollständige Wikipedia-Seite in Millisekunden analysieren und abfragen!

Einige Nachteile, die Sie bei lxml berücksichtigen sollten:

  • Schwierigere Lernkurve als BeautifulSoup. XPath-Abfragen haben eine steilere Lernkurve als CSS-Selektoren.
  • Keine integrierte Kodierungserkennung wie BS4.
  • Keine pythonische Objektdarstellung von Elementen wie BS4. Die Manipulation erfolgt über DOM-Navigations-APIs.

Dennoch ist lxml für die meisten Web-Scraping-Produktionen ein wesentlicher Bestandteil Ihres Toolkits. Durch die Geschwindigkeitssteigerung können Sie viel mehr Daten viel effizienter durchsuchen.

parsel – lxml, vereinfacht

Wenn Ihnen gefällt, was lxml bietet, Sie aber die API zu komplex finden, schauen Sie sich das an Paket.

Parsel bietet eine benutzerfreundlichere, pythonischere API, indem es lxml umschließt und eine selektorbasierte Schnittstelle zum Scrapen von Daten aus HTML/XML bereitstellt.

Der Hauptvorteil von Parsel ist Einfachheit und Lesbarkeit. Parsel wurde von Grund auf mit Blick auf Web Scraping entwickelt, während lxml eine viel breitere Palette von XML-Parsing-Funktionen unterstützt.

Im Vergleich zu lxml bietet Parsel:

  • Vereinfachte CSS-Auswahlausdrücke
  • Automatische Kodierungsbehandlung
  • Viel einfachere APIs zur Attribut- und Textextraktion
  • Insgesamt intuitiverer Ansatz

So extrahieren Sie beispielsweise Text und Attribute mithilfe von Parsel-Selektoren:

from parsel import Selector

html = ‘‘‘<div>
             <p class="summary">Some text <a href="/de/more">More</a></p>
           </div>‘‘‘

sel = Selector(text=html)

print(sel.css(‘p::text‘).get()) # Some text More 

print(sel.css(‘a::attr(href)‘).get()) # /more

Die Selector-API wird jedem, der von BeautifulSoup oder jQuery kommt, sehr vertraut sein. Aber Sie erhalten alle Leistungsvorteile von lxml unter der Haube!

Insgesamt ist Parsel eine ausgezeichnete Wahl, wenn Sie eine einfache und intuitive Scraping-Oberfläche wünschen, aber nicht auf die Geschwindigkeits- oder Kompatibilitätsvorteile von lxml verzichten möchten.

html5lib – Standardkonformes Parsen

Eine der coolsten BeautifulSoup-Alternativen ist html5lib.

html5lib ist einzigartig, weil es HTML genau so analysiert, wie es ein moderner Webbrowser tut. Es nähert sich strikt der HTML-Spezifikation und gibt ein Dokumentobjektmodell aus, das sich eng an der offiziellen W3C-DOM-Spezifikation hält.

Zu den Vorteilen von html5lib gehören:

  • Getreue und konforme HTML-Analyse gemäß den HTML5-Browserregeln
  • Anmutiger Umgang mit fehlerhaftem Markup in der realen Welt
  • Einfache Installation, da es ausschließlich in Python implementiert ist
  • Kann in den meisten Fällen als Ersatz für BS4 dienen
  • Hochgradig anpassbar und erweiterbar

Schauen wir uns die grundlegende Verwendung von html5lib an:

import html5lib

html = ‘<div><span>Example</span></div>‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

print(dom.getElementsByTagName(‘span‘)[0].toxml())  
# <span>Example</span>

Wir können sehen, dass html5lib aus dem Dokument ein Standard-DOM-Objekt erzeugt.

Ein Nachteil ist, dass html5lib langsamer ist als etwas wie lxml. Aber es ist eine gute Wahl, wenn Sie einen Parser benötigen, der selbst fehlerhafte Markups browserkonform verarbeiten kann.

Alternative Python-HTML-Parser

Während lxml, parsel und html5lib zu den leistungsfähigsten BeautifulSoup-Alternativen gehören, gibt es noch einige andere Optionen:

  • PyQuery – DOM-Manipulation im jQuery-Stil.
  • SchöneSoup4 – Die OG BeautifulSoup. Langsamere, aber sehr zugängliche API.
  • HTMLParser – Pythons integrierter HTML-Parser.
  • htmlmin – Zur Minimierung von HTML.
  • MarkupSafe – Implementiert einen HTML/XML-Parser, der Markup als Python-Objekte verfügbar macht.

Diese Bibliotheken erfüllen unterschiedliche Parsing-Anforderungen. PyQuery bietet beispielsweise eine jQuery-artige DOM-Manipulation. BeautifulSoup4 ist aufgrund seiner einfachen API nach wie vor beliebt.

Es gibt auch Python-Bindungen für schnelle HTML-Parser wie Gans und jschnell die andere zugrunde liegende Hochgeschwindigkeits-Parsing-Engines nutzen.

Obwohl dies kein direkter Ersatz ist, kann für grundlegende Parsing-Aufgaben auch der in Python integrierte HTMLParser funktionieren.

Der Punkt ist: Beschränken Sie sich nicht nur auf BeautifulSoup. Bewerten Sie Ihre Anforderungen anhand der vielen verfügbaren Parsing-Tools.

Vergleich der Parser in Benchmarks

Um die Leistungsunterschiede zu demonstrieren, vergleichen wir einige gängige Vorgänge mit BeautifulSoup, lxml, html5lib und Pythons HTMLParser.

Ich habe ein einfaches erstellt Benchmark-Skript das mal verschiedene Parser für 3 Aufgaben:

  1. Parsen einer ca. 3 KB großen Wikipedia-HTML-Seite
  2. Alle Links finden
  3. Bestimmte Elemente finden

Und hier sind die Ergebnisse auf meinem Laptop:

ParserAnalysezeitAlle Links findenElement finden
lxml3.5ms9ms0.1ms
html5lib33ms64ms7ms
BeautifulSuppe12ms18ms1ms
HTMLParser4ms32ms0.5ms

Wie erwartet ist lxml extrem schnell – bei einigen Vorgängen 10x schneller als html5lib. Überraschenderweise kann sich HTMLParser beim einfachen Parsen behaupten, beginnt jedoch beim Abfragen von Elementen zu verzögern.

Diese Benchmarks in einem kleinen Dokument verdeutlichen die Unterschiede. Bei größeren HTML-Dokumenten, bei denen die Geschwindigkeit von lxml wirklich glänzt, würden die Lücken noch größer werden.

Beispiele aus der Praxis

Lassen Sie uns nun einige Beispiele aus der Praxis durchgehen, indem wir diese alternativen Parser für Web-Scraping-Aufgaben verwenden:

Scraping von Produktlisten mit lxml

Hier extrahieren wir einige Produktlisten von einer E-Commerce-Website. Mit Lxml können wir schnell alle benötigten Daten extrahieren:

from lxml import html
import requests

page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)

# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘) 

for product in products:
   name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
   price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

   print(name, price)   

Mit lxml können wir selbst große HTML-Dokumente schnell analysieren und prägnante XPath-Abfragen verwenden, um alle benötigten Daten zu extrahieren.

Scraping von Tabellen mit Pandas und html5lib

Nehmen wir an, wir müssen HTML-Tabellen in einen Pandas-DataFrame kopieren. Html5lib analysiert Tabellen zuverlässig:

import html5lib
import pandas as pd

html = ‘‘‘<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
   </tr>
   <tr>
     <td>John</td>
     <td>30</td>  
   </tr>
   <tr>
     <td>Jane</td>
     <td>32</td>  
   </tr>
</table>‘‘‘

parser = html5lib.HTMLParser()
dom = parser.parse(html)

rows = []
for tr in dom.getElementsByTagName(‘tr‘):
  rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])

df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)  
#    Name  Age
# 0  John   30   
# 1  Jane   32

Die Einhaltung von Standards durch Html5lib stellt sicher, dass das Table Scraping auch bei problematischem Markup konsistent funktioniert.

Text mit Parsel kratzen

Bei textlastigen Seiten erleichtert Parsel das Extrahieren:

from parsel import Selector 

html = ‘‘‘<div>
            <p>Paragraph 1</p>
            <p>Paragraph 2</p>
         </div>‘‘‘

sel = Selector(text=html)  
content = sel.xpath(‘//div//text()‘).getall()
print(content)

# [‘Paragraph 1‘, ‘Paragraph 2‘]

Parsel bietet uns die Einfachheit von BeautifulSoup kombiniert mit der Geschwindigkeit von lxml!

Kriterien für die Auswahl einer HTML-Parsing-Bibliothek

Welche Kriterien sind bei der Bewertung all dieser BeautifulSoup-Alternativen für Ihr Projekt am wichtigsten?

  • Schnelligkeit – Wenn es auf die Leistung ankommt, ist lxml kaum zu schlagen.

  • Richtigkeit – Für zuverlässiges Parsen auf problematischen Seiten glänzt html5lib.

  • Funktionsumfang – Lxml bietet eine umfassendere DOM-Navigation und XPath-Unterstützung.

  • Vertraute API – Die CSS-Selektoren von BeautifulSoup sind am einfachsten zu erlernen.

  • Umgang mit fehlerhaftem Markup – Lxml und html5lib verarbeiten reales HTML robuster.

  • Einhaltung von Standards – Html5lib hält sich am striktesten an das HTML5-Browserverhalten.

  • Benutzerfreundlichkeit – Parsel und PyQuery bieten die einfachsten Scraping-APIs.

Es gibt keinen einzigen besten Parser für alle Szenarien. Analysieren Sie Ihre spezifischen Anforderungen und Anwendungsfälle, um zu entscheiden, was optimal ist.

Oft ist die Verwendung einer Kombination von Bibliotheken am besten – zum Beispiel html5lib zum Parsen und lxml zum Abfragen. Testen Sie verschiedene Optionen auf Beispielseiten, um ein Gefühl dafür zu bekommen, was für Ihre speziellen Web-Scraping-Anforderungen gut und zuverlässig funktioniert.

Parserloses Web-Scraping

Wir haben uns hier auf HTML-Parsing-Bibliotheken konzentriert. Es ist jedoch erwähnenswert, dass es Alternativen zum Parsing-Ansatz gibt.

Es ist möglich, Daten ohne HTML-Parser zu extrahieren, indem man Folgendes verwendet:

  • Reguläre Ausdrücke – Regex kann zum Musterabgleich von Roh-HTML und zum Extrahieren von Daten verwendet werden. Spröde, aber manchmal für einfache Fälle brauchbar.
  • String-Operationen – Verwenden Sie Python-String-Methoden, um HTML-Strings zu suchen, zu teilen und zu segmentieren.
  • HTTP-Anfragen – Stellen Sie Anfragen direkt an APIs und scannen Sie API-Antworten.
  • Browser-Automatisierung – Nutzen Sie Tools wie Selenium, um gerenderte JavaScript-Inhalte zu scrapen.
  • Konvertieren Sie in Formate wie JSON/XML – Scrapen Sie strukturierte Datenfeeds anstelle von HTML.

Diese Ansätze können nützlich sein, lassen sich jedoch in der Regel nicht skalieren oder funktionieren nicht zuverlässig, insbesondere bei komplexen Websites. Im Allgemeinen werden aus Stabilitätsgründen HTML-Parsing-Bibliotheken empfohlen.

Wenn Ihre Seiten jedoch extrem einfach sind oder Sie JS-Rendering benötigen, kann ein Ansatz ohne Parser ausreichen.

Key Take Away

Während Beautiful Soup viele gängige HTML-Parsing-Anforderungen erfüllt, sind Alternativen wie lxml, parsel und html5lib eine Überlegung wert:

  • Lxml – Der Goldstandard für Geschwindigkeit und Leistung. Ideal für Bahnscraping im Produktionsmaßstab.

  • Paket – Einfache API für einfaches Scraping. Baut auf lxml-Geschwindigkeit auf.

  • html5lib – Browserkonformes Parsing für Genauigkeit und Einhaltung von Standards.

  • Benchmarks – Lxml ist bei einigen Vorgängen bis zu 100-mal schneller als html5lib.

  • Eigenschaften – Geschwindigkeit vs. Lesbarkeit vs. Korrektheit. Bewerten Sie Kompromisse für Ihren Anwendungsfall.

  • Kein Parser – In einfachen Fällen funktionieren möglicherweise Regex-/String-Operationen.

Beschränken Sie sich nicht nur auf BeautifulSoup – das Python-Ökosystem bietet eine erstaunliche Vielfalt an HTML-Parsing-Funktionen. Profitieren Sie von den richtigen Werkzeugen für jede Aufgabe!

Stichworte:

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *