Dekodowanie encji HTML za pomocą Pythona

Próbuję rozkodować wpisy HTML z tego miejsca NYTimes.com i nie mogę zrozumieć, co robię źle.

Weźmy na przykład:

"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
Próbowałem BeautifulSoup, decode ('iso-8859-1') i django.utils.kodowanie smart_str bez powodzenia.
Author: Triptych, 2009-07-30

4 answers

Try this:

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)
 6
Author: Evan Fosmark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-31 06:01:00

W rzeczywistości to, co masz, nie jest encjami HTML. Istnieją trzy odmiany tych &.....; thingies -- na przykład       Wszystkie oznaczają przestrzeń bez przerwy U + 00A0.

  (typ, który masz) jest "numeric character reference" (decimal).
  jest "numerycznym odniesieniem do znaków" (szesnastkowym).
  jest bytem.

Czytaj dalej: http://htmlhelp.com/reference/html40/entities/

Tutaj znajdziesz kod dla Python2.x, który wykonuje wszystkie trzy w jednym skanowaniu poprzez wejście: http://effbot.org/zone/re-sub.htm#unescape-html

 20
Author: John Machin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-16 15:31:14

To działa:

from BeautifulSoup import BeautifulStoneSoup
s = "U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
decoded = BeautifulStoneSoup(s, convertEntities=BeautifulStoneSoup.HTML_ENTITIES)

Jeśli chcesz mieć ciąg znaków zamiast obiektu Unicode, musisz dekodować go do kodowania, które obsługuje używane znaki; ISO-8859-1 nie:

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

To niefortunne, że potrzebujesz zewnętrznego modułu do czegoś takiego; proste dekodowanie encji HTML / XML powinno znajdować się w bibliotece standardowej i nie wymagać ode mnie używania biblioteki z bezsensownymi nazwami klas, takimi jak "BeautifulStoneSoup". (Nazwy klas i funkcji nie powinny być " twórcze", powinny być znaczące.)

 18
Author: Glenn Maynard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-30 20:37:46
>>> 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’

Funkcja jest nieudokumentowana w Pythonie 2. jest stałe w Pythonie 3.4+: jest eksponowane jako html.unescape() tam .

 18
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-07 19:13:52