tag scrap read parsear parse htmlparse data python unicode character-encoding content-type beautifulsoup

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í .