Eu respeito completamente o uso da Beautiful Soup para obter conteúdo renderizado, mas pode não ser o pacote ideal para adquirir o conteúdo renderizado em uma página.
Eu tive um problema semelhante para obter conteúdo renderizado ou o conteúdo visível em um navegador típico. Em particular, tive muitos casos talvez atípicos para trabalhar com um exemplo tão simples abaixo. Nesse caso, a marca não exibível está aninhada em uma marca de estilo e não é visível em muitos navegadores que verifiquei. Existem outras variações, como definir uma exibição de configuração de tag de classe como nenhuma. Em seguida, use esta classe para a 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>
Uma solução postada acima é:
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']
Essa solução certamente possui aplicativos em muitos casos e funciona muito bem em geral, mas no html postado acima, ele mantém o texto que não é renderizado. Depois de pesquisar no SO, algumas soluções surgiram aqui BeautifulSoup get_text não remove todas as tags e JavaScript e aqui Renderizou HTML em texto sem formatação usando Python
Tentei as duas soluções: html2text e nltk.clean_html e fiquei surpreso com os resultados do tempo, por achar que eles mereciam uma resposta para a posteridade. Obviamente, as velocidades dependem muito do conteúdo dos dados ...
Uma resposta aqui do @Helge foi sobre o uso do nltk de todas as coisas.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Funcionou muito bem para retornar uma string com html renderizado. Esse módulo nltk foi mais rápido que o html2text, embora talvez o html2text seja mais robusto.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
nunca soube sobre esse recurso