Pergunta

Eu estou procurando um módulo python que vai me ajudar a se livrar de tags HTML, mas manter os valores de texto. Tentei BeautifulSoup antes e eu não conseguia descobrir como fazer esta tarefa simples. Eu tentei procurar módulos Python que poderia fazer isso, mas todos eles parecem ser dependente de outras bibliotecas que não funcionam bem em AppEngine.

Abaixo está um código de exemplo de biblioteca sanitize de Ruby e isso é o que eu sou depois em 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'

Obrigado por suas sugestões.

-e

Foi útil?

Solução

>>> 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']

Isto dá-lhe uma lista de strings (Unicode). Se você quiser transformá-lo em uma única seqüência, o uso ''.join(thatlist).

Outras dicas

Se você não quiser usar libs separados, então você pode importar utils Django padrão. Por exemplo:

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

Além disso, sua já incluído nos modelos de Django, para que você não precisa de mais nada, filtro de uso justo, como este:

{{ unsafehtml|striptags }}

Aliás, este é um dos maneira mais rápida.

Usando 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:

Este é um link e alguns texto em negrito seguida por uma imagem

tarde, mas.

Você pode usar Jinja2.Markup ()

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

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top