2009-03-19 13 views
12

¿Alguien sabe una manera fácil en Python para convertir una cadena con los códigos de entidades HTML (por ejemplo &lt;&amp;) a una cadena normal (por ejemplo, < &)?códigos HTML Entidad a texto

cgi.escape() escapó cuerdas (mal), pero no hay unescape().

Respuesta

37

HTMLParser tiene la funcionalidad en la biblioteca estándar. Está, por desgracia, indocumentado:

(python2 Docs)

>>> import HTMLParser 
>>> h= HTMLParser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
u'alpha < \u03b2' 

(Python 3 Docs)

>>> import html.parser 
>>> h = html.parser.HTMLParser() 
>>> h.unescape('alpha &lt; &beta;') 
'alpha < \u03b2' 

htmlentitydefs está documentada, pero se requiere hacer una gran parte del trabajo tú mismo.

Si solo necesita las entidades XML predefinidas (lt, gt, amp, quot, apos), puede usar minidom para analizarlas. Si solo necesita las entidades predefinidas y sin referencias de caracteres numéricos, incluso podría usar simplemente un reemplazo de cadena antiguo para la velocidad.

+1

+1 No conocía esa función de HTMLParser – vartec

+2

Aquí hay una función documentada de la biblioteca estándar que convertirá el código HTML escapado en una cadena normal: http://docs.python.org/library/xml.sax. utils.html # xml.sax.saxutils.unescape –

+0

En Python 3.4, está [documentado] (https://docs.python.org/3/library/html.html#html.unescape). – 9000

1

Utilice el módulo htmlentitydefs. Este mi viejo código, funcionó, pero estoy seguro de que es mucho más limpio y más Pythonic hacerlo:

e2c = dict(('&%s;'%k,eval("u'\\u%04x'"%v)) for k, v in htmlentitydefs.name2codepoint.items()) 
12

que se olvidó de etiquetar al principio, pero lo estoy usando BeautifulSoup.

escarbar en la documentación, que encontré:

soup = BeautifulSoup(html, convertEntities=BeautifulSoup.HTML_ENTITIES) 

lo hace exactamente como yo esperaba.

+4

Esto solo funciona para las versiones de BeautifulSoup anteriores a BS4. Si está utilizando BS4, debe utilizar un formateador: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters – kronion

+2

no funciona para & En realidad, si una cadena contiene '&' , BeautifulSoup lo convierte de nuevo a &, que es lo contrario de lo que esperaba. –

Cuestiones relacionadas