2010-06-01 7 views
11
from lxml.html.clean import clean_html, Cleaner 
    def clean(text): 
     try:   
      cleaner = Cleaner(scripts=True, embedded=True, meta=True, page_structure=True, links=True, style=True, 
         remove_tags = ['a', 'li', 'td']) 
      print (len(cleaner.clean_html(text))- len(text)) 
      return cleaner.clean_html(text) 
     except: 
      print 'Error in clean_html' 
      print sys.exc_info() 
      return text 

J'ai assemblé le code (moche) ci-dessus en tant qu'initiations initiales en territoire python. J'essaie d'utiliser le nettoyeur lxml pour nettoyer quelques pages html, donc à la fin, je suis juste parti avec le texte et rien d'autre - mais essayez comme je le fais, le ci-dessus ne semble pas fonctionner comme tel, je suis toujours à gauche avec une quantité substial de balisage (et il ne marche pas semble être cassé html), et en particulier des liens qui ne sont pas enlevés se, malgré les args j'utiliser dans remove_tags et links=Truepython [lxml] - nettoyage des balises HTML

une idée ce qui se passe, peut-être Im aboyant le mauvais arbre avec lxml? Je pensais que c'était la voie à suivre avec l'analyse html en python?

+0

Je ne suis pas en mesure de reproduire le problème en utilisant http : //stackoverflow.com/questions/2950131/python-lxml-cleaning-out-html-tags/2950223#2950223 en entrée. Pourriez-vous fournir un échantillon du code HTML et de la sortie désirée? – unutbu

+0

~ unutbu c'est le plus étrange - j'ai une base de données entière où ce code n'a pas fonctionné - et pourtant, il semble fonctionner très bien maintenant? (Avez-vous fait quelque chose :)?) mais tout en im à elle, une idée que vous pouvez aussi prendre le lien texte sur, lors du retrait du lien (en raison atm laisse le texte des liens). –

+0

@sadhu_: 'remove_tags' supprime uniquement les tags eux-mêmes; il laisse ses enfants et le texte. Utilisez 'kill_tags' pour supprimer l'arbre entier. – jfs

Répondre

5

Je pense que vous devriez vérifier Beautiful Soup. Utilisez les conseils de this article et dépouiller les éléments HTML de la manière suivante:

from BeautifulSoup import BeautifulSoup 

''.join(BeautifulSoup(page).findAll(text=True)) 

page est votre chaîne de HTML.

Si vous avez besoin de précisions, vous pouvez consulter la plongée dans l'étude de cas sur Python HTML parsing.

+3

Il semble BS est dépréciée (et googler semble suggérer lxml est la voie à suivre ..) si idéalement je voulais apprendre quelques lxml [que la documentation est légèrement déconcertante ..] –

+0

roches BS! Avec 4.0 rc out (il y a quelques mois), vous pouvez utiliser l'analyseur de 'lxml' ou' html5lib' et les placer dans la belle API BS. – Sergio

12

Je ne sais pas si cette méthode existait au moment que vous avez fait votre question, mais si vous passez par

document = lxml.html.document_fromstring(html_text) 
raw_text = document.text_content() 

Cela devrait vous revenir tout le contenu du texte dans le document html, moins toutes les balises.

+0

Commander la réponse de Robert ci-dessous - lien pour http://stackoverflow.com/a/23929354/9908 paresseux – David

8
solution

de David concaténer le texte sans séparateur:

import lxml.html 
    document = lxml.html.document_fromstring(html_string) 
    # internally does: etree.XPath("string()")(document) 
    print document.text_content() 

mais celui-ci m'a aidé - concaténation la façon dont je avais besoin:

from lxml import etree 
    print "\n".join(etree.XPath("//text()")(document)) 
+1

Ceci est beaucoup plus utile. – David

Questions connexes