BeautifulSoup get_text de ne pas supprimer toutes les balises et JavaScript
Je suis en train d'utiliser BeautifulSoup à obtenir le texte des pages web.
Ci-dessous est un script que j'ai écrit pour le faire. Elle prend deux arguments, le premier est l'entrée de fichier HTML ou XML, le deuxième fichier de sortie.
import sys
from bs4 import BeautifulSoup
def stripTags(s): return BeautifulSoup(s).get_text()
def stripTagsFromFile(inFile, outFile):
open(outFile, 'w').write(stripTags(open(inFile).read()).encode("utf-8"))
def main(argv):
if len(sys.argv) <> 3:
print 'Usage:\t\t', sys.argv[0], 'input.html output.txt'
return 1
stripTagsFromFile(sys.argv[1], sys.argv[2])
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv))
Malheureusement, pour de nombreuses pages web, par exemple: http://www.greatjobsinteaching.co.uk/career/134112/Education-Manager-Location
J'obtiens quelque chose comme ça (je suis en montrant seulement quelques premières lignes):
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
Education Manager Job In London With Caleeda | Great Jobs In Teaching
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-15255540-21']);
_gaq.push(['_trackPageview']);
_gaq.push(['_trackPageLoadTime']);
Il n'y a rien de mal avec mon script? J'ai essayé de passer 'xml' comme second argument de BeautifulSoup du constructeur, ainsi que "html5lib" et "lxml", mais il ne l'aide pas.
Est-il une alternative à BeautifulSoup qui est la meilleure pour cette tâche? Tout ce que je veux est d'extraire le texte qui sera rendu dans un navigateur pour cette page web.
Toute aide sera très appréciée.
Merci, je ne l'avais pas vu quand j'ai demandé à ma question. Il n'est point dans une bonne direction, mais il n'est pas parfait, car il ne supprime pas tous les JS et les commentaires.
OriginalL'auteur piokuc | 2012-05-09
Vous devez vous connecter pour publier un commentaire.
nltk de
clean_html()
est assez bonne à ce!En supposant que vos avez déjà votre html stocké dans une variable
html
commealors utilisez simplement
Mise à JOUR
Soutien pour
clean_html
etclean_url
sera abandonné pour les futures versions de nltk. Veuillez utiliser BeautifulSoup pour l'instant...c'est très regrettable.Un exemple sur la façon d'y parvenir est sur cette page:
BeatifulSoup4 get_text a encore javascript
Dommage que le support est d'être supprimé. C'est une fonctionnalité très utile dans nltk.
OriginalL'auteur elgehelge
Ici est une approche qui est basée sur la réponse ici: BeautifulSoup Saisir Visible Page De Texte par jbochi. Cette approche permet des commentaires incorporés dans les éléments contenant du texte de la page, et fait un peu de nettoyer la sortie par le décapage des retours à la ligne, à la consolidation de l'espace, etc.
Oui, et il semble fonctionner pour moi. Vous rencontrez des problèmes avec elle?
Oui, le problème est que la sortie de votre script pour l'exemple de la page web commence par: 'IFRAME class="nsframe" scrolling="no" frameborder="0"></IFRAME', alors il y a <script> avec du code JavaScript, des <div> et <input> balises.
OriginalL'auteur Dan Garant
C'était le problème que j'ai. aucune solution ne semble être en mesure de retourner au texte (le texte qui pourrait être rendu dans le navigateur web). D'autres solutions mentionné que BS n'est pas l'idéal pour le rendu et que html2text était une bonne approche. J'ai essayé les deux html2text et nltk.clean_html et a été surpris par le timing ainsi, les résultats de la pensée qu'ils justifiaient une réponse pour la postérité. Bien sûr, la vitesse du delta pourrait dépendent fortement du contenu des données...
Une réponse de @Helge a propos de l'utilisation de nltk de toutes choses.
Il a vraiment bien travaillé pour renvoyer une chaîne de rendu html. Cette nltk module a été plus rapide que même html2text, mais peut-être html2text est plus robuste.
OriginalL'auteur Paul