Je voudrais extraire le texte d'un fichier HTML en utilisant Python. Je veux essentiellement la même sortie que j'obtiendrais si je copiais le texte à partir d'un navigateur et le collais dans le bloc-notes.
J'aimerais quelque chose de plus robuste que d'utiliser des expressions régulières qui peuvent échouer sur du HTML mal formé. J'ai vu beaucoup de gens recommander Beautiful Soup, mais j'ai eu quelques problèmes à l'utiliser. D'une part, il a récupéré du texte indésirable, comme une source JavaScript. En outre, il n'a pas interprété les entités HTML. Par exemple, je m'attendrais à & # 39; dans la source HTML à convertir en apostrophe dans le texte, comme si j'avais collé le contenu du navigateur dans le bloc-notes.
La mise à jour html2text
semble prometteuse. Il gère correctement les entités HTML et ignore JavaScript. Cependant, il ne produit pas exactement du texte brut; il produit une démarque qui devrait ensuite être transformée en texte brut. Il est livré sans exemples ni documentation, mais le code semble propre.
Questions connexes:
la source
Réponses:
html2text est un programme Python qui fait un très bon travail dans ce domaine.
la source
Le meilleur morceau de code que j'ai trouvé pour extraire du texte sans obtenir du javascript ou des choses non désirées:
Il vous suffit d'installer BeautifulSoup avant:
la source
text = soup.get_text(separator=' ')
soup.get_text()
j'ai utilisésoup.body.get_text()
, de sorte que je n'obtienne aucun texte de l'<head
élément>, comme le titre.from urllib.request import urlopen
REMARQUE: NTLK ne prend plus en charge la
clean_html
fonctionRéponse originale ci-dessous, et une alternative dans les sections commentaires.
Utiliser NLTK
J'ai perdu mes 4-5 heures à résoudre les problèmes avec html2text. Heureusement, j'ai pu rencontrer NLTK.
Cela fonctionne comme par magie.
la source
raise NotImplementedError ("To remove HTML markup, use BeautifulSoup's get_text() function")
Je me suis retrouvé face au même problème aujourd'hui. J'ai écrit un analyseur HTML très simple pour supprimer le contenu entrant de tous les annotations, renvoyant le texte restant avec un minimum de mise en forme.
la source
&
ne sera pas converti en&
, non?from html.parser import HTMLParser
Voici une version de la réponse de xperroni qui est un peu plus complète. Il ignore les sections de script et de style et traduit les caractères (par exemple, & # 39;) et les entités HTML (par exemple, & amp;).
Il comprend également un convertisseur inverse trivial de texte brut en html.
la source
Je sais qu'il y a déjà beaucoup de réponses, mais la solution la plus élégante et pythonique que j'ai trouvée est décrite en partie ici .
Mettre à jour
Sur la base du commentaire de Fraser, voici une solution plus élégante:
la source
text = ''.join(BeautifulSoup(some_html_string, "lxml").findAll(text=True))
clean_text = ''.join(BeautifulSoup(some_html_string, "html.parser").stripped_strings
Vous pouvez également utiliser la méthode html2text dans la bibliothèque de stripogrammes.
Pour installer le stripogramme, exécutez sudo easy_install stripogram
la source
Il existe une bibliothèque de modèles pour l'exploration de données.
http://www.clips.ua.ac.be/pages/pattern-web
Vous pouvez même décider quelles balises conserver:
la source
PyParsing fait un excellent travail. Le wiki PyParsing a été tué alors voici un autre endroit où il y a des exemples d'utilisation de PyParsing ( exemple de lien ). Une des raisons pour investir un peu de temps dans le pyparsing est qu'il a également écrit un très bref manuel O'Reilly Short Cut très bien organisé qui est également peu coûteux.
Cela dit, j'utilise beaucoup BeautifulSoup et ce n'est pas si difficile de traiter les problèmes d'entités, vous pouvez les convertir avant d'exécuter BeautifulSoup.
Bonne chance
la source
Ce n'est pas exactement une solution Python, mais cela convertira le texte que Javascript générerait en texte, ce qui, je pense, est important (EG google.com). Le navigateur Links (pas Lynx) a un moteur Javascript et convertira la source en texte avec l'option -dump.
Vous pourriez donc faire quelque chose comme:
la source
Au lieu du module HTMLParser, consultez htmllib. Il a une interface similaire, mais fait plus de travail pour vous. (C'est assez ancien, donc ce n'est pas très utile pour se débarrasser de javascript et css. Vous pouvez créer une classe dérivée, mais et ajouter des méthodes avec des noms comme start_script et end_style (voir les documents python pour plus de détails), mais c'est difficile pour le faire de manière fiable pour le html malformé.) Quoi qu'il en soit, voici quelque chose de simple qui imprime le texte brut sur la console
la source
Je recommande un package Python appelé goose-extractor Goose essaiera d'extraire les informations suivantes:
Texte principal d'un article Image principale de l'article Tous les films Youtube / Vimeo intégrés à l'article Meta Description Meta tags
Plus: https://pypi.python.org/pypi/goose-extractor/
la source
si vous avez besoin de plus de vitesse et moins de précision, vous pouvez utiliser du lxml brut.
la source
installer html2text en utilisant
puis,
la source
Je sais qu'il y a déjà beaucoup de réponses ici, mais je pense que journal3k mérite également une mention. J'ai récemment dû effectuer une tâche similaire d'extraction du texte d'articles sur le Web et cette bibliothèque a fait un excellent travail jusqu'à présent dans mes tests. Il ignore le texte trouvé dans les éléments de menu et les barres latérales ainsi que tout JavaScript qui apparaît sur la page à la demande du PO.
Si vous avez déjà téléchargé les fichiers HTML, vous pouvez faire quelque chose comme ceci:
Il a même quelques fonctionnalités NLP pour résumer les sujets des articles:
la source
Une belle soupe convertit les entités html. C'est probablement votre meilleur choix étant donné que le HTML est souvent bogué et rempli de problèmes d'encodage unicode et html. Voici le code que j'utilise pour convertir du HTML en texte brut:
la source
Une autre option consiste à exécuter le code HTML via un navigateur Web basé sur du texte et à le vider. Par exemple (en utilisant Lynx):
Cela peut être fait dans un script python comme suit:
Il ne vous donnera pas exactement le texte du fichier HTML, mais selon votre cas d'utilisation, il peut être préférable à la sortie de html2text.
la source
Le mieux a fonctionné pour moi, ce sont les scripts.
https://github.com/weblyzard/inscriptis
Les résultats sont vraiment bons
la source
Une autre solution non python: Libre Office:
La raison pour laquelle je préfère celle-ci aux autres alternatives est que chaque paragraphe HTML est converti en une seule ligne de texte (pas de saut de ligne), ce que je cherchais. D'autres méthodes nécessitent un post-traitement. Lynx produit une belle sortie, mais pas exactement ce que je cherchais. En outre, Libre Office peut être utilisé pour convertir à partir de toutes sortes de formats ...
la source
Quelqu'un a essayé l' eau
bleach.clean(html,tags=[],strip=True)
de Javel ? ça marche pour moi.la source
J'ai eu de bons résultats avec Apache Tika . Son but est l'extraction des métadonnées et du texte du contenu, d'où l'analyseur sous-jacent est réglé en conséquence hors de la boîte.
Tika peut être exécuté en tant que serveur , est facile à exécuter / déployer dans un conteneur Docker, et à partir de là, il est accessible via des liaisons Python .
la source
d'une manière simple
ce code trouve toutes les parties du html_text commencées par «<» et se terminant par «>» et remplace toutes celles trouvées par une chaîne vide
la source
@ La réponse de PeYoTIL en utilisant BeautifulSoup et en éliminant le style et le contenu du script n'a pas fonctionné pour moi. Je l'ai essayé en utilisant
decompose
au lieu deextract
mais cela n'a toujours pas fonctionné. J'ai donc créé le mien qui formate également le texte à l'aide des<p>
balises et remplace les<a>
balises par le lien href. Gère également les liens à l'intérieur du texte. Disponible à ce point avec un doc de test intégré.la source
get_text
ne le coupe tout simplement pas.Dans Python 3.x, vous pouvez le faire d'une manière très simple en important des packages 'imaplib' et 'email'. Bien que ce soit un post plus ancien, mais ma réponse peut peut-être aider les nouveaux arrivants sur ce post.
Vous pouvez maintenant imprimer la variable de corps et elle sera au format texte brut :) Si cela vous convient, il serait bien de la sélectionner comme réponse acceptée.
la source
text/plain
partie d'un e-mail si quelqu'un d'autre en a mis une. Il ne fait rien pour convertir le HTML en texte brut et ne fait rien d'utile à distance si vous essayez de convertir du HTML à partir, disons, d'un site Web.vous ne pouvez extraire que du texte de HTML avec BeautifulSoup
la source
Bien que de nombreuses personnes aient mentionné l'utilisation de l'expression rationnelle pour supprimer les balises HTML, il existe de nombreux inconvénients.
par exemple:
Doit être analysé pour:
Voici un extrait que j'ai trouvé, vous pouvez le personnaliser selon vos besoins spécifiques, et cela fonctionne comme un charme
la source
Un autre exemple utilisant BeautifulSoup4 dans Python 2.7.9+
comprend:
Code:
Expliqué:
Lisez les données url en html (en utilisant BeautifulSoup), supprimez tous les éléments de script et de style, et obtenez également le texte en utilisant .get_text (). Séparez en lignes et supprimez les espaces de début et de fin sur chacun, puis divisez les titres multiples en une ligne chaque morceau = (phrase.strip () pour la ligne en lignes pour la phrase en ligne.split ("")). Ensuite, en utilisant text = '\ n'.join, supprimez les lignes vierges, puis retournez comme sanctionné utf-8.
Remarques:
Certains systèmes sur lesquels cela s'exécute échoueront avec les connexions https: // en raison d'un problème SSL, vous pouvez désactiver la vérification pour résoudre ce problème. Exemple de correctif: http://blog.pengyifan.com/how-to-fix-python-ssl-certificate_verify_failed/
Python <2.7.9 peut rencontrer des problèmes lors de l'exécution de ce
text.encode ('utf-8') peut laisser un encodage étrange, peut vouloir simplement renvoyer str (text) à la place.
la source
Voici le code que j'utilise régulièrement.
J'espère que ça aide.
la source
Le commentaire de l'écrivain LibreOffice a du mérite puisque l'application peut utiliser des macros python. Il semble offrir de multiples avantages à la fois pour répondre à cette question et pour développer la base macro de LibreOffice. Si cette résolution est une implémentation unique, plutôt que d'être utilisée dans le cadre d'un programme de production plus important, l'ouverture du code HTML dans le rédacteur et l'enregistrement de la page en tant que texte semblent résoudre les problèmes abordés ici.
la source
Perl way (désolé maman, je ne le ferai jamais en production).
la source