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.
<html>
<title> Title here</title>
<body>
lots of text here <p> <br>
<h1> even headings </h1>
<style type="text/css">
<div > this will not be visible </div>
</style>
</body>
</html>
Eine der oben genannten Lösungen ist:
html = Utilities.ReadFile('simple.html')
soup = BeautifulSoup.BeautifulSoup(html)
texts = soup.findAll(text=True)
visible_texts = filter(visible, texts)
print(visible_texts)
[u'\n', u'\n', u'\n\n lots of text here ', u' ', u'\n', u' even headings ', u'\n', u' this will not be visible ', u'\n', u'\n']
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.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
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.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
nie über diese Funktion gewusst