Question

Je cherche un module python qui me permettra de se débarrasser des balises HTML, mais conserver les valeurs de texte. J'ai essayé BeautifulSoup avant et je ne pouvais pas comprendre comment faire cette tâche simple. J'ai essayé la recherche de modules Python qui pourrait le faire, mais ils semblent tous dépendre d'autres bibliothèques qui ne fonctionne pas bien sur AppEngine.

Voici un exemple de code de la bibliothèque de sanitize de Ruby et que 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

Était-ce utile?

La solution

>>> 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 voulez transformer en une seule chaîne, utilisez ''.join(thatlist).

Autres conseils

Si vous ne voulez 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

En outre 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.

Utilisation 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
#!/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:

  

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

fin, mais.

Vous pouvez utiliser Jinja2.Markup ()

http://jinja.pocoo.org/docs/api/# jinja2.Markup.striptags

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top