Question

J'essaie de décoder les entrées HTML d'ici NYTimes.com et je ne peux pas comprendre ce que je fais de travers.

Prenez par exemple:

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

J'ai essayé BeautifulSoup, decode ('iso-8859-1') et smart_str de django.utils.encoding sans aucun succès.

Était-ce utile?

La solution

Essayez ceci:

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)

Autres conseils

En réalité, ce que vous avez ne sont pas des entités HTML. Il existe TROIS variétés de celles-ci & .....; thingies - par exemple & amp; # 160; & amp; # xa0; & amp; nbsp; signifie tous U + 00A0 ESPACE NO-BREAK.

& amp; # 160; (le type que vous avez) est une "référence de caractère numérique". (décimal).
& amp; # xa0; est une "référence de caractère numérique". (hexadécimal).
& amp; nbsp; est une entité.

Lectures supplémentaires: http://htmlhelp.com/reference/html40/entities/

Vous trouverez ici le code de Python2.x qui analyse les trois entrées en une fois: 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 fonction est non documentée dans Python 2. Elle est corrigée dans Python 3.4+ : elle est exposée comme html.unescape () .

Cela fonctionne:

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 vous souhaitez une chaîne au lieu d'un objet Unicode, vous devez la décoder en un codage prenant en charge les caractères utilisés. ISO-8859-1 ne:

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

Il est regrettable que vous ayez besoin d’un module externe pour quelque chose comme ceci; le décodage d'entité HTML / XML simple doit être dans la bibliothèque standard et ne pas nécessiter que j'utilise une bibliothèque avec des noms de classe sans signification comme "BeautifulStoneSoup". (Les noms de classe et de fonction ne doivent pas être "créatifs", ils doivent avoir un sens.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top