Декодирование объектов HTML с помощью Python
Я пытаюсь декодировать HTML-записи отсюда NYTimes.com, и я не могу понять, что я делаю неправильно.
Возьмем, например:
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
Я попробовал BeautifulSoup, расшифровал (iso-8859-1) и django.utils.encoding smart_str без каких-либо успехов.
Ответы
Ответ 1
Попробуйте следующее:
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)
Ответ 2
На самом деле то, что у вас есть, не являются объектами HTML. Существуют три разновидности этих &.....; предметы - например,    
все среднее значение U + 00A0 NO-BREAK SPACE.
 
(тип, который у вас есть) - это "числовая символьная ссылка" (десятичная).
 
- это "числовая символьная ссылка" (шестнадцатеричная).
является сущностью.
Дополнительная литература: http://htmlhelp.com/reference/html40/entities/
Здесь вы найдете код для Python2.x, который делает все три в одном сканировании через вход: http://effbot.org/zone/re-sub.htm#unescape-html
Ответ 3
Это работает:
from BeautifulSoup import BeautifulStoneSoup
s = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
decoded = BeautifulStoneSoup(s, convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
Если вам нужна строка вместо объекта Unicode, вам нужно будет декодировать ее до кодировки, которая поддерживает используемые символы; ISO-8859-1:
result = decoded.encode("UTF-8")
Несчастливо вам нужен внешний модуль для чего-то подобного; простое декодирование объектов HTML/XML должно быть в стандартной библиотеке и не требует, чтобы я использовал библиотеку с бессмысленными именами классов, такими как "BeautifulStoneSoup". (Названия классов и функций не должны быть "креативными", они должны иметь смысл.)
Ответ 4
>>> 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’
Функция недокументирована в Python 2. Исправлено в Python 3.4+: она отображается как html.unescape()
там.