Rispetto completamente l'utilizzo di Beautiful Soup per ottenere contenuti renderizzati, ma potrebbe non essere il pacchetto ideale per acquisire il contenuto renderizzato su una pagina.
Ho avuto un problema simile per ottenere il contenuto visualizzato o il contenuto visibile in un tipico browser. In particolare ho avuto molti casi forse atipici su cui lavorare con un esempio così semplice di seguito. In questo caso il tag non visualizzabile è annidato in un tag di stile e non è visibile in molti browser che ho controllato. Esistono altre varianti come la definizione di una visualizzazione dell'impostazione di un tag di classe su nessuno. Quindi usando questa classe per il 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>
Una soluzione pubblicata sopra è:
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']
Questa soluzione ha certamente applicazioni in molti casi e fa il lavoro abbastanza bene in generale, ma nell'html postato sopra mantiene il testo che non viene visualizzato. Dopo aver cercato SO, un paio di soluzioni sono arrivate qui BeautifulSoup get_text non rimuove tutti i tag e JavaScript e qui HTML reso in testo normale usando Python
Ho provato entrambe queste soluzioni: html2text e nltk.clean_html e sono rimasto sorpreso dai risultati dei tempi, quindi ho pensato che garantissero una risposta per i posteri. Ovviamente le velocità dipendono fortemente dal contenuto dei dati ...
Una risposta qui da @Helge riguardava l'utilizzo di nltk di tutte le cose.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Ha funzionato molto bene per restituire una stringa con html renderizzato. Questo modulo nltk era più veloce persino di html2text, anche se forse html2text è più robusto.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
non aver mai saputo di quella funzione