read - scrap html python
Decodificando entidades HTML con Python (4)
Estoy tratando de decodificar las entradas HTML desde aquí NYTimes.com y no puedo entender qué estoy haciendo mal.
Tomar como 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.
En realidad lo que tienes no son entidades HTML. Hay TRES variedades de esos & .....; cosas - por ejemplo    
   
Todo significa U + 00A0 ESPACIO DE NO-BREAK.
 
(el tipo que tiene) es una "referencia de carácter numérico" (decimal).
 
es una "referencia de carácter numérico" (hexadecimal).
es una entidad
Más información: http://htmlhelp.com/reference/html40/entities/
Aquí encontrará el código para Python2.x que hace los tres en un escaneo a través de la entrada: http://effbot.org/zone/re-sub.htm#unescape-html
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, tendrá que decodificarla a una codificación que admita los caracteres que se utilizan; ISO-8859-1 no lo hace:
result = decoded.encode("UTF-8")
Es lamentable que necesite 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 sentido como "BeautifulStoneSoup". (Los nombres de clase y función no deben ser "creativos", deben ser significativos).
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)
>>> 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 corrigió en Python 3.4+ : está expuesta como html.unescape()
allí .