2009-05-03 15 views
7

que tienen una cadena de símbolos como este:¿Cómo liberar apóstrofes y tal en Python?

' 

Eso es al parecer un apóstrofe.

me trataron saxutils.unescape() sin ninguna suerte e intentó urllib.unquote()

¿Cómo puedo descifrar esto? ¡Gracias!

Respuesta

2

Salida this question. Lo que estás buscando es "decodificación de entidades html". Normalmente, encontrará una función llamada algo así como "htmldecode" que hará lo que quiera. Tanto Django como Cheetah proporcionan funciones como BeautifulSoup.

La otra respuesta funcionará genial si no desea utilizar una biblioteca y todas las entidades son numéricas.

+0

gracias. que tiene Django? porque miré en los documentos pero no pude encontrar nada ... – rick

+0

Se llama django.utils.html.escape, al parecer. Mira la otra pregunta de stackoverflow que he vinculado para obtener más detalles. – easel

+0

parece que django.utils.html.escape solo funciona para codificar, no decodificar. Terminé usando BeautifulSoup. Gracias – rick

-2

no estoy seguro sobre el & o el #, pero aquí hay un código para la decodificación:

>>>chr(39) 
"'" 
>>>ord("'") 
39 
1

La solución más robusta parece ser this function por la luminaria de Python Fredrik Lundh. No es la solución más corta, pero maneja entidades con nombre, así como códigos hexadecimales y decimales.

2

Prueba esto: (encontrado here)

from htmlentitydefs import name2codepoint as n2cp 
import re 

def decode_htmlentities(string): 
    """ 
    Decode HTML entities–hex, decimal, or named–in a string 
    @see http://snippets.dzone.com/posts/show/4569 

    >>> u = u'E tu vivrai nel terrore - L'aldilà (1981)' 
    >>> print decode_htmlentities(u).encode('UTF-8') 
    E tu vivrai nel terrore - L'aldilà (1981) 
    >>> print decode_htmlentities("l'eau") 
    l'eau 
    >>> print decode_htmlentities("foo < bar")     
    foo < bar 
    """ 
    def substitute_entity(match): 
     ent = match.group(3) 
     if match.group(1) == "#": 
      # decoding by number 
      if match.group(2) == '': 
       # number is in decimal 
       return unichr(int(ent)) 
      elif match.group(2) == 'x': 
       # number is in hex 
       return unichr(int('0x'+ent, 16)) 
     else: 
      # they were using a name 
      cp = n2cp.get(ent) 
      if cp: return unichr(cp) 
      else: return match.group() 

    entity_re = re.compile(r'&(#?)(x?)(\w+);') 
    return entity_re.subn(substitute_entity, string)[0] 
Cuestiones relacionadas