Ich möchte den Text mit Python aus einer HTML-Datei extrahieren. Ich möchte im Wesentlichen die gleiche Ausgabe, die ich erhalten würde, wenn ich den Text aus einem Browser kopieren und in den Editor einfügen würde.
Ich hätte gerne etwas Robusteres als die Verwendung regulärer Ausdrücke, die bei schlecht geformtem HTML fehlschlagen könnten. Ich habe viele Leute gesehen, die Beautiful Soup empfohlen haben, aber ich hatte ein paar Probleme damit. Zum einen wurden unerwünschte Texte wie JavaScript-Quellen erfasst. Außerdem wurden HTML-Entitäten nicht interpretiert. Zum Beispiel würde ich erwarten, & # 39; in einer HTML-Quelle, die im Text in ein Apostroph konvertiert werden soll, als hätte ich den Browserinhalt in den Editor eingefügt.
Update html2text
sieht vielversprechend aus. Es behandelt HTML-Entitäten korrekt und ignoriert JavaScript. Es wird jedoch nicht genau Klartext erzeugt. es erzeugt einen Abschlag, der dann in einfachen Text umgewandelt werden müsste. Es enthält keine Beispiele oder Dokumentation, aber der Code sieht sauber aus.
Verwandte Fragen:
quelle
Antworten:
html2text ist ein Python-Programm, das hier ziemlich gute Arbeit leistet.
quelle
Der beste Code, den ich zum Extrahieren von Text gefunden habe, ohne Javascript zu erhalten oder Dinge nicht zu wollen:
Sie müssen BeautifulSoup nur installieren, bevor Sie:
quelle
text = soup.get_text(separator=' ')
soup.get_text()
Ich habe verwendetsoup.body.get_text()
, damit ich keinen Text vom<head
> Element erhalte , wie z. B. den Titel.from urllib.request import urlopen
HINWEIS : NTLK unterstützt die
clean_html
Funktion nicht mehrOriginalantwort unten und eine Alternative in den Kommentaren.
Verwenden Sie NLTK
Ich habe meine 4-5 Stunden damit verbracht, die Probleme mit html2text zu beheben. Zum Glück konnte ich NLTK begegnen.
Es funktioniert magisch.
quelle
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Ich stand heute vor dem gleichen Problem. Ich habe einen sehr einfachen HTML-Parser geschrieben, um eingehenden Inhalt aller Markups zu entfernen und den verbleibenden Text mit nur einem Minimum an Formatierung zurückzugeben.
quelle
&
Wird zum Beispiel nicht konvertiert&
, oder?from html.parser import HTMLParser
Hier ist eine Version von xperronis Antwort, die etwas vollständiger ist. Es überspringt Skript- und Stilabschnitte und übersetzt Zeichen (z. B. & # 39;) und HTML-Entitäten (z. B. & amp;).
Es enthält auch einen einfachen Umkehrkonverter von Klartext zu HTML.
quelle
Ich weiß, dass es bereits viele Antworten gibt, aber die eleganteste und pythonischste Lösung, die ich gefunden habe, wird teilweise hier beschrieben .
Aktualisieren
Basierend auf Frasers Kommentar ist hier eine elegantere Lösung:
quelle
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Sie können die html2text-Methode auch in der Stripogram-Bibliothek verwenden.
Um Stripogram zu installieren, führen Sie sudo easy_install stripogram aus
quelle
Es gibt eine Musterbibliothek für Data Mining.
http://www.clips.ua.ac.be/pages/pattern-web
Sie können sogar entscheiden, welche Tags beibehalten werden sollen:
quelle
PyParsing macht einen tollen Job. Das PyParsing-Wiki wurde getötet. Hier ist ein weiterer Ort, an dem es Beispiele für die Verwendung von PyParsing gibt ( Beispiellink ). Ein Grund, ein wenig Zeit mit Pyparsing zu verbringen, ist, dass er auch ein sehr kurzes, sehr gut organisiertes O'Reilly Short Cut-Handbuch geschrieben hat, das auch kostengünstig ist.
Trotzdem verwende ich BeautifulSoup häufig und es ist nicht so schwer, mit den Entitätsproblemen umzugehen. Sie können sie konvertieren, bevor Sie BeautifulSoup ausführen.
Viel Glück
quelle
Dies ist nicht gerade eine Python-Lösung, aber sie konvertiert Text, den Javascript in Text generieren würde, was ich für wichtig halte (z. B. google.com). Die Browser-Links (nicht Lynx) verfügen über eine Javascript-Engine und konvertieren die Quelle mit der Option -dump in Text.
Sie könnten also so etwas tun:
quelle
Schauen Sie sich anstelle des HTMLParser-Moduls htmllib an. Es hat eine ähnliche Oberfläche, erledigt aber mehr Arbeit für Sie. (Es ist ziemlich alt, daher ist es keine große Hilfe, um Javascript und CSS loszuwerden. Sie könnten eine abgeleitete Klasse erstellen, aber Methoden mit Namen wie start_script und end_style hinzufügen (Details finden Sie in den Python-Dokumenten), aber es ist schwierig um dies zuverlässig für fehlerhaftes HTML zu tun.) Wie auch immer, hier ist etwas Einfaches, das den Klartext auf die Konsole druckt
quelle
Ich empfehle ein Python-Paket namens Goose-Extractor Goose, das versucht, die folgenden Informationen zu extrahieren:
Haupttext eines Artikels Hauptbild des Artikels Alle in Artikel eingebetteten Youtube / Vimeo-Filme Meta Beschreibung Meta-Tags
Mehr: https://pypi.python.org/pypi/goose-extractor/
quelle
Wenn Sie mehr Geschwindigkeit und weniger Genauigkeit benötigen, können Sie rohes lxml verwenden.
quelle
Installieren Sie html2text mit
dann,
quelle
Ich weiß, dass es hier bereits viele Antworten gibt, aber ich denke, zeitung3k verdient auch eine Erwähnung. Ich musste kürzlich eine ähnliche Aufgabe erledigen, um den Text aus Artikeln im Web zu extrahieren, und diese Bibliothek hat dies in meinen Tests bisher hervorragend erreicht. Es ignoriert den Text in Menüelementen und Seitenleisten sowie jegliches JavaScript, das auf der Seite als OP-Anforderung angezeigt wird.
Wenn Sie die HTML-Dateien bereits heruntergeladen haben, können Sie Folgendes tun:
Es gibt sogar einige NLP-Funktionen zum Zusammenfassen der Themen von Artikeln:
quelle
Schöne Suppe konvertiert HTML-Entitäten. Dies ist wahrscheinlich die beste Wahl, wenn man bedenkt, dass HTML häufig fehlerhaft ist und Probleme mit der Unicode- und HTML-Codierung aufweist. Dies ist der Code, mit dem ich HTML in Rohtext konvertiere:
quelle
Eine andere Möglichkeit besteht darin, den HTML-Code über einen textbasierten Webbrowser auszuführen und zu sichern. Zum Beispiel (mit Lynx):
Dies kann in einem Python-Skript wie folgt erfolgen:
Sie erhalten nicht genau den Text aus der HTML-Datei, aber je nach Anwendungsfall ist er möglicherweise der Ausgabe von html2text vorzuziehen.
quelle
Am besten funktioniert für mich Inschriften.
https://github.com/weblyzard/inscriptis
Die Ergebnisse sind wirklich gut
quelle
Eine andere Nicht-Python-Lösung: Libre Office:
Der Grund, warum ich diesen anderen Alternativen vorziehe, ist, dass jeder HTML-Absatz in eine einzelne Textzeile konvertiert wird (keine Zeilenumbrüche), wonach ich gesucht habe. Andere Methoden erfordern eine Nachbearbeitung. Lynx liefert zwar eine gute Ausgabe, aber nicht genau das, wonach ich gesucht habe. Außerdem kann Libre Office verwendet werden, um aus allen möglichen Formaten zu konvertieren ...
quelle
Hat jemand
bleach.clean(html,tags=[],strip=True)
mit Bleichmittel versucht ? es funktioniert für mich.quelle
Ich habe mit Apache Tika gute Ergebnisse erzielt . Sein Zweck ist das Extrahieren von Metadaten und Text aus Inhalten, daher wird der zugrunde liegende Parser sofort entsprechend optimiert.
Tika kann als Server ausgeführt werden , ist in einem Docker-Container trivial auszuführen und bereitzustellen und kann von dort über Python-Bindungen aufgerufen werden .
quelle
auf einfache Weise
Dieser Code findet alle Teile des HTML-Textes, die mit '<' beginnen und mit '>' enden, und ersetzt alle gefundenen durch eine leere Zeichenfolge
quelle
Die Antwort von @ PeYoTIL mit BeautifulSoup und das Eliminieren von Stil- und Skriptinhalten hat bei mir nicht funktioniert. Ich habe es mit
decompose
statt versucht,extract
aber es hat immer noch nicht funktioniert. Also habe ich meine eigene erstellt, die auch den Text mit den<p>
Tags formatiert und<a>
Tags durch den href-Link ersetzt. Bewältigt auch Links im Text. Verfügbar in diesem Kern mit einem eingebetteten Testdokument .quelle
get_text
schneidet BeautifulSoup's einfach nicht ab.In Python 3.x können Sie dies auf sehr einfache Weise tun, indem Sie die Pakete 'imaplib' und 'email' importieren. Dies ist zwar ein älterer Beitrag, aber vielleicht kann meine Antwort Neulingen in diesem Beitrag helfen.
Jetzt können Sie die Body-Variable drucken und sie wird im Klartext-Format vorliegen :) Wenn sie für Sie gut genug ist, wäre es schön, sie als akzeptierte Antwort auszuwählen.
quelle
text/plain
Teil aus einer E-Mail extrahieren, wenn jemand anderes eines dort abgelegt hat. Es konvertiert den HTML-Code nicht in Klartext und ist auch nicht im entferntesten nützlich, wenn Sie versuchen, HTML-Code beispielsweise von einer Website zu konvertieren.Mit BeautifulSoup können Sie nur Text aus HTML extrahieren
quelle
Während viele Leute erwähnten, Regex zu verwenden, um HTML-Tags zu entfernen, gibt es viele Nachteile.
beispielsweise:
Sollte analysiert werden zu:
Hier ist ein Ausschnitt, den ich mir ausgedacht habe. Sie können ihn an Ihre spezifischen Bedürfnisse anpassen und er funktioniert wie ein Zauber
quelle
Ein weiteres Beispiel für die Verwendung von BeautifulSoup4 in Python 2.7.9+
beinhaltet:
Code:
Erklärt:
Lesen Sie die URL-Daten als HTML ein (mit BeautifulSoup), entfernen Sie alle Skript- und Stilelemente und rufen Sie mit .get_text () nur den Text ab. Brechen Sie in Zeilen ein und entfernen Sie jeweils führende und nachfolgende Leerzeichen. Teilen Sie dann mehrere Überschriften in eine Zeile auf, die jeweils Chunks = (Phrase.strip () für Zeile in Zeilen für Phrase in Zeile.Split ("")). Verwenden Sie dann text = '\ n'.join, lassen Sie leere Zeilen fallen und kehren Sie schließlich als sanktioniertes utf-8 zurück.
Anmerkungen:
Einige Systeme, auf denen dies ausgeführt wird, schlagen aufgrund eines SSL-Problems mit https: // -Verbindungen fehl. Sie können die Überprüfung deaktivieren, um dieses Problem zu beheben. Beispielfix: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 hat möglicherweise ein Problem beim Ausführen
text.encode ('utf-8') kann eine seltsame Codierung hinterlassen und möchte stattdessen möglicherweise nur str (text) zurückgeben.
quelle
Hier ist der Code, den ich regelmäßig verwende.
Ich hoffe das hilft.
quelle
Der LibreOffice-Writer-Kommentar ist sinnvoll, da die Anwendung Python-Makros verwenden kann. Es scheint mehrere Vorteile zu bieten, sowohl für die Beantwortung dieser Frage als auch für die Förderung der Makrobasis von LibreOffice. Wenn diese Lösung eine einmalige Implementierung ist und nicht als Teil eines größeren Produktionsprogramms verwendet werden soll, scheint das Öffnen des HTML-Codes im Writer und das Speichern der Seite als Text die hier diskutierten Probleme zu lösen.
quelle
Perl Weg (sorry Mama, ich werde es nie in der Produktion tun).
quelle