Je respecte complètement l'utilisation de Beautiful Soup pour obtenir du contenu rendu, mais ce n'est peut-être pas le package idéal pour acquérir le contenu rendu sur une page.
J'ai eu un problème similaire pour obtenir le contenu rendu ou le contenu visible dans un navigateur typique. En particulier, j'ai eu de nombreux cas peut-être atypiques à travailler avec un exemple aussi simple ci-dessous. Dans ce cas, la balise non affichable est imbriquée dans une balise de style et n'est pas visible dans de nombreux navigateurs que j'ai vérifiés. D'autres variantes existent, telles que la définition d'un affichage de paramètre de balise de classe sur aucun. Ensuite, en utilisant cette classe pour le 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>
Une solution publiée ci-dessus est:
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']
Cette solution a certainement des applications dans de nombreux cas et fait le travail assez bien en général, mais dans le html affiché ci-dessus, elle conserve le texte qui n'est pas rendu. Après avoir recherché, quelques solutions sont apparues ici, BeautifulSoup get_text ne supprime pas toutes les balises et JavaScript et a rendu le HTML en texte brut en utilisant Python
J'ai essayé ces deux solutions: html2text et nltk.clean_html et j'ai été surpris par les résultats de synchronisation alors j'ai pensé qu'ils justifiaient une réponse pour la postérité. Bien sûr, les vitesses dépendent fortement du contenu des données ...
Une réponse ici de @Helge concernait l'utilisation de nltk de toutes choses.
import nltk
%timeit nltk.clean_html(html)
was returning 153 us per loop
Cela fonctionnait vraiment bien pour renvoyer une chaîne avec du HTML rendu. Ce module nltk était plus rapide que même html2text, bien que peut-être html2text soit plus robuste.
betterHTML = html.decode(errors='ignore')
%timeit html2text.html2text(betterHTML)
%3.09 ms per loop
soup.findAll(text=True)
ne jamais connaître cette fonctionnalité