2010-03-10 18 views
1

Je suis à la recherche d'un module python qui m'aidera à me débarrasser des balises HTML tout en conservant les valeurs du texte. J'ai essayé BeautifulSoup avant et je ne pouvais pas comprendre comment faire cette tâche simple. J'ai essayé de rechercher des modules Python qui pourraient le faire mais ils semblent tous dépendre d'autres bibliothèques qui ne fonctionnent pas bien sur AppEngine.Supprimer les balises HTML dans AppEngine Python Env (équivalent à Ruby's Sanitize)

est un code ci-dessous exemple de la bibliothèque de sanitize Ruby et c'est ce que je suis après en Python:

require 'rubygems' 
require 'sanitize' 

html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />' 

Sanitize.clean(html) # => 'foo' 

Merci pour vos suggestions.

-e

Répondre

5
>>> import BeautifulSoup 
>>> html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />' 
>>> bs = BeautifulSoup.BeautifulSoup(html) 
>>> bs.findAll(text=True) 
[u'foo'] 

Cela vous donne une liste de chaînes (Unicode). Si vous souhaitez le transformer en une seule chaîne, utilisez ''.join(thatlist).

+0

Merci, Alex. Cela devrait fonctionner - la dernière fois que j'ai essayé BeautifulSoup, je suis entré dans l'analyse de nœud par nœud et cela est devenu très lent. Maintenant que j'ai changé la façon dont je gère mon code HTML, je pourrais utiliser BeautifulSoup pour le nettoyage. J'ai complètement oublié l'option text = True. Merci! – Ecognium

+0

@Ecognium, de rien! –

+0

Pour l'utiliser dans App Engine, installez BeatifulSoup localement et utilisez le fichier dans /Bibliothèque/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages. Ou utilisez simplement ceci: http://dl.dropbox.com/u/9632169/BeautifulSoup.py – crizCraig

1

En utilisant lxml:

htmlstring = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />' 

from lxml.html import fromstring 

mySearchTree = fromstring(htmlstring) 

for item in mySearchTree.cssselect('a'): 
    print item.text 
+0

Merci, bigredbob. Ça m'a pris un moment pour que lxml fonctionne sur ma machine avec votre code - ça marche! Je ne l'ai pas encore testé sur App-Engine et je vous ferai savoir si cela ne fonctionne pas. lxml semble également gérer le mauvais balisage. – Ecognium

1
#!/usr/bin/python 

from xml.dom.minidom import parseString 

def getText(el): 
    ret = '' 
    for child in el.childNodes: 
     if child.nodeType == 3: 
      ret += child.nodeValue 
     else: 
      ret += getText(child) 
    return ret 

html = '<b>this is <a href="http://foo.com/">a link </a> and some bold text </b> followed by <img src="http://foo.com/bar.jpg" /> an image' 
dom = parseString('<root>' + html + '</root>') 
print getText(dom.documentElement) 

Prints:

c'est un lien et un texte en gras suivi d'une image

+0

Merci Amarghosh. Je pense que minidom est supporté par app-engine, ce qui devrait fonctionner correctement. – Ecognium

+0

Amarghosh, j'ai accepté la réponse d'Alex car BeautifulSoup semble mieux gérer les mauvais balisages. Merci beaucoup pour l'extrait, cependant et je peux certainement l'utiliser pour le balisage que je peux faire confiance. – Ecognium

4

Si vous ne souhaitez pas utiliser libs séparés alors vous pouvez importer des utils standards de django . Par exemple:

from django.utils.html import strip_tags 
html = '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg' 
stripped = strip_tags(html) 
print stripped 
# you got: foo 

également son déjà inclus dans les modèles de Django, de sorte que vous ne avez pas besoin toute autre chose, utilisez simplement le filtre, comme ceci:

{{ unsafehtml|striptags }} 

BTW, c'est l'un des plus rapide.

+0

Merci, Mikhail. Je vais vous donner un coup de feu. – Ecognium