Grundsätzlich möchte ich BeautifulSoup verwenden, um den sichtbaren Text auf einer Webseite genau zu erfassen. Zum Beispiel ist diese Webseite mein Testfall. Und ich möchte hauptsächlich nur den Text (Artikel) und vielleicht sogar ein paar Registerkartennamen hier und da bekommen. Ich habe den Vorschlag in dieser SO-Frage ausprobiert, der viele <script>
Tags und HTML-Kommentare zurückgibt, die ich nicht möchte. Ich kann die Argumente nicht herausfinden, die ich für die Funktion benötige findAll()
, um nur die sichtbaren Texte auf einer Webseite zu erhalten.
Wie soll ich also alle sichtbaren Texte außer Skripten, Kommentaren, CSS usw. finden?
python
text
beautifulsoup
html-content-extraction
user233864
quelle
quelle
soup.findAll(text=True)
nie über diese Funktion gewusstisinstance(element, Comment)
anstatt sie mit einem regulären Ausdruck abzugleichen.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. Ich habe auch 'Meta' zur Liste der Eltern hinzugefügt.elif re.match(r"[\s\r\n]+",str(element)): return False
Die genehmigte Antwort von @jbochi funktioniert bei mir nicht. Der Funktionsaufruf str () löst eine Ausnahme aus, da die Nicht-ASCII-Zeichen im BeautifulSoup-Element nicht codiert werden können. Hier ist eine prägnantere Möglichkeit, die Beispielwebseite nach sichtbarem Text zu filtern.
quelle
str(element)
Probleme mit der Codierung fehlschlagen, sollten Sie esunicode(element)
stattdessen versuchen, wenn Sie Python 2 verwenden.quelle
Ich respektiere es vollkommen, Beautiful Soup zu verwenden, um gerenderten Inhalt zu erhalten, aber es ist möglicherweise nicht das ideale Paket, um den gerenderten Inhalt auf einer Seite zu erfassen.
Ich hatte ein ähnliches Problem beim Abrufen gerenderter Inhalte oder der sichtbaren Inhalte in einem typischen Browser. Insbesondere hatte ich viele vielleicht atypische Fälle, um mit einem so einfachen Beispiel unten zu arbeiten. In diesem Fall ist das nicht anzeigbare Tag in einem Style-Tag verschachtelt und in vielen von mir überprüften Browsern nicht sichtbar. Es gibt andere Variationen, z. B. das Definieren einer Anzeige für die Einstellung von Klassen-Tags auf "Keine". Verwenden Sie dann diese Klasse für die div.
Eine der oben genannten Lösungen ist:
Diese Lösung hat sicherlich in vielen Fällen Anwendungen und erledigt die Arbeit im Allgemeinen recht gut, aber im oben angegebenen HTML-Code wird der nicht gerenderte Text beibehalten. Nach der Suche nach SO wurden hier einige Lösungen gefunden. BeautifulSoup get_text entfernt nicht alle Tags und JavaScript und hier wird HTML mit Python in einfachen Text gerendert
Ich habe beide Lösungen ausprobiert: html2text und nltk.clean_html und war von den Timing-Ergebnissen überrascht, sodass ich dachte, dass sie eine Antwort für die Nachwelt rechtfertigen. Natürlich hängen die Geschwindigkeiten stark vom Inhalt der Daten ab ...
Eine Antwort von @Helge hier war, ausgerechnet nltk zu verwenden.
Es hat sehr gut funktioniert, einen String mit gerendertem HTML zurückzugeben. Dieses nltk-Modul war schneller als sogar html2text, obwohl html2text möglicherweise robuster ist.
quelle
Wenn Sie Wert auf Leistung legen, finden Sie hier einen weiteren effizienteren Weg:
soup.strings
ist ein Iterator und wird zurückgegeben,NavigableString
sodass Sie den Tag-Namen des übergeordneten Elements direkt überprüfen können, ohne mehrere Schleifen durchlaufen zu müssen.quelle
Der Titel befindet sich in einem
<nyt_headline>
Tag, das in einem<h1>
Tag und einem<div>
Tag mit der ID "Artikel" verschachtelt ist .Sollte arbeiten.
Der Artikelkörper befindet sich in einem
<nyt_text>
Tag, das in einem<div>
Tag mit der ID "articleBody" verschachtelt ist . Innerhalb des<nyt_text>
Elements ist der Text selbst in<p>
Tags enthalten. Bilder befinden sich nicht in diesen<p>
Tags. Es ist schwierig für mich, mit der Syntax zu experimentieren, aber ich erwarte, dass ein funktionierender Kratzer ungefähr so aussieht.quelle
Während ich generell empfehlen würde, schöne Suppe zu verwenden, wenn jemand die sichtbaren Teile eines fehlerhaften HTML-Codes (z. B. wenn Sie nur ein Segment oder eine Zeile einer Webseite haben) aus irgendeinem Grund anzeigen möchte, die folgenden entfernt Inhalte zwischen
<
und>
Tags:quelle
Verwenden Sie BeautifulSoup am einfachsten mit weniger Code, um nur die Zeichenfolgen zu erhalten, ohne leere Zeilen und Mist.
quelle
Der einfachste Weg, um diesen Fall zu behandeln, ist die Verwendung von
getattr()
. Sie können dieses Beispiel an Ihre Bedürfnisse anpassen:Dadurch wird das Textelement
"3.7"
innerhalb des Tag-Objekts gefunden,<span class="ratingsContent">3.7</span>
wenn es vorhanden ist. Standardmäßig wirdNoneType
es jedoch verwendet, wenn dies nicht der Fall ist.quelle
quelle