Respeto completamente el uso de Beautiful Soup para obtener contenido renderizado, pero puede que no sea el paquete ideal para adquirir el contenido renderizado en una página.
Tuve un problema similar para obtener contenido renderizado o el contenido visible en un navegador típico. En particular, tuve muchos casos quizás atípicos para trabajar con un ejemplo tan simple a continuación. En este caso, la etiqueta no visualizable está anidada en una etiqueta de estilo, y no está visible en muchos navegadores que he verificado. Existen otras variaciones, como definir una visualización de configuración de etiqueta de clase en none. Luego, usando esta clase para el 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 solución publicada anteriormente es:
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']
Esta solución ciertamente tiene aplicaciones en muchos casos y hace el trabajo bastante bien en general, pero en el html publicado arriba retiene el texto que no se muestra. Después de buscar SO, surgieron un par de soluciones BeautifulSoup get_text no elimina todas las etiquetas y JavaScript y aquí se procesó HTML en texto sin formato usando Python
Probé ambas soluciones: html2text y nltk.clean_html y me sorprendieron los resultados de tiempo, así que pensé que justificaban una respuesta para la posteridad. Por supuesto, las velocidades dependen en gran medida del contenido de los datos ...
Una respuesta aquí de @Helge fue sobre usar nltk de todas las cosas.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Funcionó muy bien para devolver una cadena con html procesado. Este módulo nltk fue más rápido que incluso html2text, aunque quizás html2text es más robusto.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
nunca supo de esa característica