¿Cómo puedo eliminar las entidades HTML de una cadena en Python 3.1?

Busqué por todos lados y solo encontré soluciones para Python 2.6 y anteriores, NADA sobre cómo hacer esto en Python 3.X. (Solo tengo acceso a la caja de Win7).

TENGO que ser capaz de hacer esto en 3.1 y preferiblemente sin bibliotecas externas. Actualmente, tengo instalado httplib2 y tengo acceso a la curva de símbolo del sistema (así es como obtengo el código fuente de las páginas). Desafortunadamente, curl no decodifica entidades html, por lo que 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 el entorno de MS Windows, le estaría muy agradecido.

Entonces, para ser claros, necesito girar cadenas como esta: Suzy & John 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 mayor:

 import html.parser html.parser.HTMLParser().unescape('Suzy & John') 

En Python2 :

 import HTMLParser HTMLParser.HTMLParser().unescape('Suzy & John') 

Puede utilizar xml.sax.saxutils.unescape para este propósito. Este módulo se incluye en la biblioteca estándar de Python y es portátil entre Python 2.xy 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 nada más que publicar esto. La respuesta de unutbu no quita las citas. Lo único que encontré fue esta función.

 importar re
 de htmlentitydefs importa name2codepoint como n2cp

 def decodeHtmlentities (cadena):
     def sustituto_entidad (coincidencia):        
         ent = match.group (2)
         si match.group (1) == "#":
             volver unichr (int (ent))
         más:
             cp = n2cp.get (ent)
             si cp:
                 volver unichr (cp)
             más:
                 devuelve match.group ()
     entity_re = re.compile ("& (#?) (\ d {1,5} | \ w {1,8});")
     return entity_re.subn (substitución_entidad, cadena) [0]

Que obtuve de esta página .

Python 3.x también tiene html.entities

En mi caso tengo una cadena html escapada en la función de escape as3. Después de una hora de buscar en Google, no he encontrado nada útil, así que escribí esta función de recusrive para satisfacer mis necesidades. Aquí está,

 def unescape(string): index = string.find("%") if index == -1: return string else: #if it is escaped unicode character do different decoding if string[index+1:index+2] == 'u': replace_with = ("\\"+string[index+1:index+6]).decode('unicode_escape') string = string.replace(string[index:index+6],replace_with) else: replace_with = string[index+1:index+3].decode('hex') string = string.replace(string[index:index+3],replace_with) return unescape(string) 

Edit-1 Agregada funcionalidad para manejar caracteres Unicode.

No estoy seguro de si se trata de una biblioteca integrada o no, pero se parece a lo que necesita y es compatible con 3.1.

De: http://docs.python.org/3.1/library/xml.sax.utils.html?highlight=html%20unescape

xml.sax.saxutils.unescape (datos, entidades = {}) Unescape ‘&’, ‘<' y '>‘ en una cadena de datos.