Pregunta

Busco a un módulo de Python que le ayudará a deshacerse de las etiquetas HTML, pero mantener los valores de texto. Probé BeautifulSoup antes y no podía encontrar la manera de hacer esta tarea sencilla. He intentado buscar los módulos Python que podrían hacer esto, pero todos parecen ser dependientes de otras bibliotecas que no funcionan bien en App Engine.

A continuación se muestra un código de ejemplo de la biblioteca de higienización de Ruby y eso es lo que busco 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'

Gracias por sus sugerencias.

-e

¿Fue útil?

Solución

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

Esto le da una lista de cadenas (Unicode). Si desea convertirla en una sola cadena, utilice ''.join(thatlist).

Otros consejos

Si no desea utilizar bibliotecas separadas a continuación, puede importar Django estándar utilidades. Por ejemplo:

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

Además de su ya incluidos en las plantillas de Django, por lo que no necesita nada más, sólo tiene que utilizar el filtro, como esto:

{{ unsafehtml|striptags }}

Por cierto, esta es una de la manera más rápida.

El uso de 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)

Las impresiones:

  

Este es un enlace y un poco de texto en negrita, seguido de una imagen

tarde, pero.

Puede utilizar Jinja2.Markup ()

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

from jinja2 import Markup 
Markup("<div>About</div>").striptags()
u'About'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top