ここNYTimes.comからHTMLエントリをデコードしようとしていますが、何が間違っているのか理解できません。
たとえば、次のようにします。
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
BeautifulSoup、decode('iso-8859-1')、およびdjango.utils.encodingのsmart_strを試しましたが、成功しませんでした。
ここNYTimes.comからHTMLエントリをデコードしようとしていますが、何が間違っているのか理解できません。
たとえば、次のようにします。
"U.S. Adviser’s Blunt Memo on Iraq: Time ‘to Go Home’"
BeautifulSoup、decode('iso-8859-1')、およびdjango.utils.encodingのsmart_strを試しましたが、成功しませんでした。
実際にあなたが持っているのは HTML エンティティではありません。それらには 3 つの種類があります &.....; もの -- たとえば、   
すべて U+00A0 NO-BREAK SPACE を意味します。
 
(あなたが持っているタイプ)は「数字参照」(10進数)です。
 
「数字参照」(16 進数)です。
エンティティです。
さらに読む: http://htmlhelp.com/reference/html40/entities/
ここでは、入力を 1 回のスキャンで 3 つすべてを実行する Python2.x のコードを見つけることができます: http://effbot.org/zone/re-sub.htm#unescape-html
これは機能します:
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」のような意味のないクラス名を持つライブラリを使用する必要はありません。(クラス名と関数名は「創造的」であってはならず、意味のあるものでなければなりません。)
これを試して:
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)