¿Cómo puedo eliminar el escape de entidades HTML en una cadena en Python 3.1? [duplicar]
Busqué por todos lados y solo encontré soluciones para Python 2.6 y versiones anteriores, NADA sobre cómo hacer esto en Python 3.X. (Solo tengo acceso al cuadro Win7).
TENGO que poder hacer esto en 3.1 y preferiblemente sin bibliotecas externas. Actualmente, tengo httplib2 instalado y acceso al símbolo del sistema curl (así es como obtengo el código fuente de las páginas). Desafortunadamente, curl no decodifica entidades html; hasta donde yo sé, no pude encontrar un comando para decodificarlo en la documentación.
SÍ, he intentado que Beautiful Soup funcione, MUCHAS VECES sin éxito en 3.X. Si pudiera proporcionar instrucciones EXPLÍCITAS sobre cómo hacer que funcione en Python 3 en un entorno MS Windows, se lo agradecería mucho.
Entonces, para ser claros, necesito convertir cadenas como esta: Suzy & John
en una cadena como esta: "Suzy & John".
Podrías usar la función html.unescape :
En Python3.4+ (gracias a JF Sebastian por la actualización):
import html
html.unescape('Suzy & John')
# 'Suzy & John'
html.unescape('"')
# '"'
En Python3.3 o anterior:
import html.parser
html.parser.HTMLParser().unescape('Suzy & John')
En Python2 :
import HTMLParser
HTMLParser.HTMLParser().unescape('Suzy & John')
Puedes utilizar xml.sax.saxutils.unescape
para este propósito. Este módulo está incluido en la biblioteca estándar de Python y es portátil entre Python 2.x y Python 3.x.
>>> import xml.sax.saxutils as saxutils
>>> saxutils.unescape("Suzy & John")
'Suzy & John'
Aparentemente no tengo una reputación lo suficientemente alta como para hacer otra cosa que publicar esto. La respuesta de unutbu no escapa a las citas. Lo único que encontré que hizo fue esta función:
import re
from htmlentitydefs import name2codepoint as n2cp
def decodeHtmlentities(string):
def substitute_entity(match):
ent = match.group(2)
if match.group(1) == "#":
return unichr(int(ent))
else:
cp = n2cp.get(ent)
if cp:
return unichr(cp)
else:
return match.group()
entity_re = re.compile("&(#?)(\d{1,5}|\w{1,8});")
return entity_re.subn(substitute_entity, string)[0]
Que obtuve de esta página .
Python 3.x también tiene html.entities