¿Cómo puedo eliminar el escape de entidades HTML en una cadena en Python 3.1? [duplicar]

Resuelto VolatileRig asked hace 14 años • 6 respuestas

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 & Johnen una cadena como esta: "Suzy & John".

VolatileRig avatar Mar 02 '10 09:03 VolatileRig
Aceptado

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')
unutbu avatar Mar 02 '2010 03:03 unutbu

Puedes utilizar xml.sax.saxutils.unescapepara 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'
Greg Hewgill avatar Mar 02 '2010 03:03 Greg Hewgill

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 .

Derrick Petzold avatar Sep 26 '2010 07:09 Derrick Petzold

Python 3.x también tiene html.entities

YOU avatar Mar 02 '2010 03:03 YOU