Pregunta

Estoy tratando de decodificar entradas HTML desde aquí NYTimes.com y no puedo entender qué estoy haciendo mal.

Tomemos, por ejemplo,

"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"

He intentado BeautifulSoup, decode ('iso-8859-1') y smart_str de django.utils.encoding sin ningún éxito.

¿Fue útil?

Solución

Prueba esto:

import re

def _callback(matches):
    id = matches.group(1)
    try:
        return unichr(int(id))
    except:
        return id

def decode_unicode_references(data):
    return re.sub("&#(\d+)(;|(?=\s))", _callback, data)

data = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
print decode_unicode_references(data)

Otros consejos

En realidad lo que tienes no son entidades HTML. Hay TRES variedades de esos & amp; .....; thingies - por ejemplo & amp; # 160; & amp; # xa0; & amp; nbsp; todos significan U + 00A0 ESPACIO SIN RIESGOS.

& amp; # 160; (el tipo que tiene) es una " referencia de carácter numérico " (decimal).
& amp; # xa0; es una " referencia de carácter numérico " (hexadecimal).
& amp; nbsp; es una entidad.

Más información: http://htmlhelp.com/reference/html40/entities/

Aquí encontrará el código para Python2.x que realiza los tres en un escaneo a través de la entrada: http://effbot.org/zone/re-sub.htm#unescape-html

>>> from HTMLParser import HTMLParser
>>> print HTMLParser().unescape('U.S. Adviser’s Blunt Memo on Iraq: '
...                             'Time ‘to Go Home’')
U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’

La función no está documentada en Python 2. Se corrige en Python 3.4+ : se expone como html.unescape () allí .

Esto funciona:

from BeautifulSoup import BeautifulStoneSoup
s = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
decoded = BeautifulStoneSoup(s, convertEntities=BeautifulStoneSoup.HTML_ENTITIES)

Si desea una cadena en lugar de un objeto Unicode, deberá descodificarla a una codificación que admita los caracteres que se utilizan; ISO-8859-1 no lo hace:

result = decoded.encode("UTF-8")

Es desafortunado que necesites un módulo externo para algo como esto; La descodificación simple de una entidad HTML / XML debería estar en la biblioteca estándar, y no me obliga a usar una biblioteca con nombres de clase sin significado como " BeautifulStoneSoup " ;. (Los nombres de clase y función no deben ser " creatividad " ;, deben ser significativos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top