Подтвердить что ты не робот

Декодирование объектов 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 без каких-либо успехов.

4b9b3361

Ответ 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() там.