1

urllibを使用してWebページを読み込んでいます。これらはロシアの記号ですが、ページのエンコーディングは「utf-8」です。

1

pageData = unicode(requestHandler.read()).decode('utf-8')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 262: ordinal not in range(128)

2

pageData = requestHandler.read()
soupHandler = BeautifulSoup(pageData)
print soupHandler.findAll(...)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 340-345: ordinal not in range(128)
4

2 に答える 2

2

最初のスニペットでは、呼び出しunicode(requestHandler.read())によって返されるバイト文字列readunicode:に変換するようにPythonに指示します。これは、変換にコードが指定されていないため、ascii試行されます(失敗します)。呼び出すポイントに到達することはありません.decode(とにかくそのユニコードオブジェクトを呼び出すことは意味がありません)。

を使用するかunicode(requestHandler.read(), 'utf-8')または :エンコーディングが実際に行われている場合requestHandler.read().decode('utf-8')、これらのいずれかが正しいUnicodeオブジェクトを生成するはずです(そのバイトの存在はそうではない可能性があることを示唆していますが、コンテキスト外の単一の非ASCII文字が表示されることから推測することは不可能です)。utf-8D0

printUnicodeデータの使用は別の問題であり、適切に構成された協調型のターミナルエミュレーター(Pythonsys.stdout.encodingを起動時に設定できるもの)が必要です。たとえば、Macでは、AppleのTerminal.Appを使用します。

>>> sys.stdout.encoding
'UTF-8'

したがって、Unicodeオブジェクトの印刷はここで正常に機能します。

>>> print u'\xabutf8\xbb'
«utf8»

utf8でエンコードされたバイト文字列の印刷も同様です。

>>> print u'\xabutf8\xbb'.encode('utf8')
«utf8»

ただし、他のマシンでは後者のみが機能します(ターミナルエミュレーター自体のエンコーディングを使用します。ターミナルエミュレーターはPythonに通知しないため、自分で検出する必要があります;-)。

于 2010-05-14T14:17:28.427 に答える
1

requestHandler.read()UTF-8でエンコードされたストリームを配信する場合は、

pageData = requestHandler.read().decode('utf-8')

これをUnicode文字列にデコードします(この時点で、Dietrich Eppが正しく指摘しているように)、unicode()呼び出しはもう必要ありません。

例外がスローされた場合、入力は明らかにUTF-8でエンコードされていません。

于 2010-05-14T14:09:23.110 に答える