Zum Inhalt

Wie wandelt man HTML in Python in Text um?

Hier ist ein Blogbeitrag mit mehr als 2000 Wörtern zum Thema „Wie wandelt man HTML in Python in Text um?“:

HTML ist ein wichtiges Format zum Speichern und Anzeigen von Daten im Web. Beim Web Scraping möchten wir oft nur den sichtbaren Textinhalt aus HTML-Seiten extrahieren. In diesem Beitrag werde ich verschiedene Techniken zum Konvertieren von HTML in sauberen Text in Python untersuchen.

Warum HTML in Text konvertieren?

Es gibt einige Hauptgründe, warum Sie HTML-Tags entfernen und nur den Text extrahieren möchten:

  • Vereinfachen Sie gelöschte Inhalte – Beim Scraping von Webseiten enthält der HTML-Code normalerweise viele zusätzliche Markups und Elemente, die wir nicht benötigen, wie z. B. Navigationslinks. Das Extrahieren des Haupttextes erleichtert die Analyse und Bearbeitung des Inhalts.

  • Formatierung entfernen – HTML wendet visuelle Formatierung und Layout an. Für viele Anwendungen wie die Stimmungsanalyse benötigen wir lediglich den Textinhalt ohne jegliche Formatierung.

  • In einem Textformat speichern – Es kann nützlich sein, nur den Text aus HTML zu extrahieren, damit er in einem einfachen Format wie einer Textdatei oder in einem Datenbanktextfeld gespeichert werden kann. Dadurch wird das gesamte umfangreiche HTML-Markup entfernt.

  • Ablesbarkeit – Das rohe HTML ist für Menschen schwer zu lesen und zu interpretieren. Durch die Konvertierung in Text wird die Lesbarkeit verbessert.

  • Zugänglichkeit – Nur-Text-Inhalte sind für Screenreader, die von sehbehinderten Benutzern verwendet werden, besser zugänglich.

  • Suchmaschinenindizierung – Suchmaschinen analysieren und indizieren größtenteils den sichtbaren Textinhalt von Seiten. Durch die Konvertierung von HTML in Text können Inhalte ähnlich analysiert werden, wie sie von Suchmaschinen angezeigt werden.

Zusammenfassend lässt sich sagen, dass das Extrahieren von Text aus HTML für Scraping, Analyse, Speicherung und Zugänglichkeit nützlich ist. Die nächsten Abschnitte behandeln verschiedene Möglichkeiten, dies in Python zu erreichen.

Entfernen von HTML-Tags mit BeautifulSoup

Beautiful Soup ist eine beliebte Python-Bibliothek zum Web-Scraping und Parsen von HTML. Wir können damit ziemlich einfach Text aus HTML extrahieren.

Die einfachste Methode ist der Aufruf von get_text() Methode entweder für ein BeautifulSoup-Objekt oder ein aus dem analysierten HTML ausgewähltes Element. Zum Beispiel:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

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

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

Dadurch werden alle HTML-Tags entfernt und eine Zeichenfolge zurückgegeben, die den sichtbaren Text enthält.

Eine Sache zu beachten ist, dass get_text() Standardmäßig werden auch mehrere aufeinanderfolgende Leerzeichen zu einem einzigen Leerzeichen zusammengefasst. Passieren strip=False um Leerzeichen wie Zeilenumbrüche und zusätzliche Leerzeichen beizubehalten:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

Um Text nur aus einem Teil des HTML-Codes zu extrahieren, rufen Sie auf get_text() auf ein Element statt auf das gesamte Dokument:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

Eine Einschränkung besteht darin get_text() enthält weiterhin jeglichen Text, der in untergeordneten Elementen wie Links verschachtelt ist. Um diese ebenfalls zu entfernen, übergeben Sie a recursive=False Argument:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

Mit BeautifulSoup können wir es also problemlos verwenden get_text() um sichtbaren Text aus HTML zu extrahieren.

Text mit lxml extrahieren

lxml ist eine weitere beliebte Python-Bibliothek zum Parsen von XML und HTML. Wir können damit auch Text extrahieren.

Aus einer lxml HTMLParser Element, nennen Sie das text_content() Methode, um den Text zu erhalten:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

Dadurch wird der gesamte Text rekursiv extrahiert, auch aus untergeordneten Elementen. Um Text von untergeordneten Elementen auszuschließen, übergeben Sie a children=False Argument:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

Daher bietet lxml auch eine einfache Möglichkeit, HTML zu entfernen und nur den Textinhalt abzurufen.

Reguläre Ausdrücke

Ein Regex-basierter Ansatz kann auch zum Entfernen von HTML-Tags verwendet werden. Dazu gehört die Verwendung eines Musters, um alle HTML-Tags abzugleichen, und Ersetzungen, um sie durch nichts zu ersetzen:

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

Die Regex r"<[^>]*>" Streichhölzer < gefolgt von irgendetwas außer > einmal oder mehrmals, gefolgt von >dem „Vermischten Geschmack“. Seine re.sub() Der Aufruf entfernt diese Übereinstimmungen und entfernt damit effektiv alle HTML-Tags.

Um auch mit XML-Namespaces und selbstschließenden Tags umzugehen:

clean = re.sub(r"<[^>]+>", "", html)

Dies ist ein schneller und einfacher Regex-basierter Ansatz zum Entfernen aller HTML-Tags. Allerdings bietet es nicht die gleiche Kontrolle und Einfachheit wie bestimmte HTML-Parsing-Bibliotheken wie BeautifulSoup und lxml.

Umgang mit der Kodierung

Webseiten können in verschiedenen Textformaten wie ASCII, UTF-8 oder ISO-8859-1 kodiert werden. Beim Scraping von Seiten möchten wir die Kodierung erkennen und ordnungsgemäß in Unicode-Text dekodieren.

Das chardet Die Bibliothek kann die Kodierung automatisch für uns erkennen:

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

Anschließend können wir die HTML-Bytes explizit in einen Unicode-String dekodieren, bevor wir den Text analysieren und extrahieren.

Beim Konvertieren von HTML in Text sollte zuerst die Kodierung vor dem Parsen durchgeführt werden, um Kodierungsfehler zu vermeiden.

Vollständiges HTML-zu-Text-Beispiel

Hier ist ein Beispiel, das die Schritte zum robusten Extrahieren von Text aus HTML zusammenfasst:

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

Dies übernimmt die Codierungserkennung, das Entfernen von Tags und das Extrahieren von Text in einer wiederverwendbaren Funktion.

Es gibt auch Python-Bibliotheken wie Text die einige dieser Funktionen zum Konvertieren verschiedener Dateiformate in Text enthalten.

Konvertieren von HTML-Entitäten

Ein weiteres Problem, auf das wir möglicherweise stoßen, ist die Verwendung von Zeichenentitäten wie HTML   und & anstelle von wörtlichen Zeichen.

Wir können das benutzen html.unescape() Funktion aus Pythons Standard HTML-Bibliothek um Entitäten wieder in Zeichen umzuwandeln:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

Dies kann vor oder nach dem Extrahieren von Text aus HTML erfolgen.

Umgang mit JavaScript

Eine Einschränkung der oben genannten Techniken besteht darin, dass sie nur sichtbaren Text aus dem ursprünglichen HTML extrahieren. Von JavaScript dynamisch hinzugefügter Text wird nicht erfasst.

Um JavaScript auszuführen und Volltext darzustellen, müssen wir einen Headless-Browser wie verwenden Selenium or Dramatiker:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

Hier wird Playwright verwendet, um die Seite zu laden und JavaScript auszuführen, sodass wir den vollständigen Text extrahieren können.

Für Seiten mit starker JS-Manipulation ist daher möglicherweise ein Browser-Automatisierungstool erforderlich, wenn wir den vollständig gerenderten Text benötigen.

Zusammenfassung

Es gibt einige Haupttechniken, um HTML in Python in einfachen Text umzuwandeln:

  • Verwenden Sie die get_text() von BeautifulSoup
  • Extrahieren Sie Inhalte mit text_content() in lxml
  • Entfernen Sie Tags mithilfe regulärer Ausdrücke
  • Dekodieren Sie alle Codierungen vor dem Parsen
  • Behandeln Sie HTML-Entitäten mit html.unescape()
  • Verwenden Sie einen Headless-Browser, wenn JavaScript ausgeführt werden muss

Das Konvertieren von HTML in Text eignet sich zur Vereinfachung von Scraping-Inhalten, zur Analyse von Text anstelle von Markups, zur Verbesserung der Lesbarkeit und Zugänglichkeit, zur Indizierung durch Suchmaschinen und zur Speicherung in einem schlanken Format.

Ich hoffe, dieser Beitrag bietet eine umfassende Anleitung zu den wichtigsten Methoden zum Extrahieren von Text aus HTML mit Python! Lassen Sie mich wissen, wenn Sie weitere nützliche Techniken haben.

Stichworte:

Mitreden

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