19

ここ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を試しましたが、成功しませんでした。

4

4 に答える 4

20

実際にあなたが持っているのは 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

于 2009-07-30T23:18:53.073 に答える
18

これは機能します:

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」のような意味のないクラス名を持つライブラリを使用する必要はありません。(クラス名と関数名は「創造的」であってはならず、意味のあるものでなければなりません。)

于 2009-07-30T20:05:12.917 に答える
5

これを試して:

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)
于 2009-07-30T19:50:07.393 に答える