Remover tags HTML em AppEngine Python Env (equivalente a Sanitize de Ruby)
-
19-09-2019 - |
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
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'