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