Fondamentalement, je souhaite utiliser BeautifulSoup pour saisir strictement le texte visible sur une page Web. Par exemple, cette page Web est mon cas de test. Et je veux principalement obtenir le corps du texte (article) et peut-être même quelques noms d'onglets ici et là. J'ai essayé la suggestion dans cette question SO qui renvoie beaucoup de <script>
balises et de commentaires html dont je ne veux pas. Je ne peux pas comprendre les arguments dont j'ai besoin pour la fonction findAll()
afin d'obtenir simplement les textes visibles sur une page Web.
Alors, comment trouver tout le texte visible à l'exception des scripts, des commentaires, des css, etc.?
python
text
beautifulsoup
html-content-extraction
user233864
la source
la source
soup.findAll(text=True)
ne jamais connaître cette fonctionnalitéisinstance(element, Comment)
au lieu de les faire correspondre avec une expression régulière.soup = BeautifulSoup(html)
elif isinstance(element,bs4.element.Comment):
. J'ai également ajouté «meta» à la liste des parents.elif re.match(r"[\s\r\n]+",str(element)): return False
La réponse approuvée de @jbochi ne fonctionne pas pour moi. L'appel de la fonction str () lève une exception car il ne peut pas encoder les caractères non-ascii dans l'élément BeautifulSoup. Voici une manière plus succincte de filtrer l'exemple de page Web en texte visible.
la source
str(element)
échec avec des problèmes d'encodage, vous devriez essayer à launicode(element)
place si vous utilisez Python 2.la source
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.
Une solution publiée ci-dessus est:
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.
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.
la source
Si vous vous souciez de la performance, voici un autre moyen plus efficace:
soup.strings
est un itérateur, et il retourneNavigableString
pour que vous puissiez vérifier directement le nom de la balise du parent, sans passer par plusieurs boucles.la source
Le titre est à l'intérieur d'une
<nyt_headline>
balise, qui est imbriquée dans une<h1>
balise et une<div>
balise avec l'ID "article".Devrait marcher.
Le corps de l'article se trouve dans une
<nyt_text>
balise, qui est imbriquée dans une<div>
balise avec l'ID "articleBody". À l'intérieur de l'<nyt_text>
élément, le texte lui-même est contenu dans des<p>
balises. Les images ne font pas partie de ces<p>
balises. Il est difficile pour moi d'expérimenter la syntaxe, mais je m'attends à ce qu'une éraflure de travail ressemble à quelque chose comme ça.la source
Bien que, je suggère complètement d'utiliser beautiful-soup en général, si quelqu'un cherche à afficher les parties visibles d'un html malformé (par exemple où vous avez juste un segment ou une ligne d'une page Web) pour une raison quelconque, ce qui suit supprimera le contenu entre les balises
<
et>
:la source
Utiliser BeautifulSoup de la manière la plus simple avec moins de code pour obtenir simplement les chaînes, sans lignes vides ni merde.
la source
Le moyen le plus simple de gérer ce cas est d'utiliser
getattr()
. Vous pouvez adapter cet exemple à vos besoins:Cela trouvera l'élément de texte
"3.7"
, dans l'objet de balise<span class="ratingsContent">3.7</span>
quand il existe, cependant, par défautNoneType
quand il n'existe pas.la source
la source