9

lxml を使用して HTML ドキュメント内のすべてのテキスト ノードを取得しようとすると、この問題が発生しますが、 UnicodeEncodeError: が発生し'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)ます。encoding = chardet.detect(response)['encoding']しかし、このページ ( )のエンコーディングの種類を調べようとすると、 と表示されますutf-8。1 つのページに utf-8 と ascii があるのは奇妙に思えます。実際、これは:

fromstring(response).text_content().encode('ascii', 'replace')

問題を解決します。

これが私のコードです:

from lxml.html import fromstring
import urllib2
import chardet
request = urllib2.Request(my_url)
request.add_header('User-Agent',
                   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')   
request.add_header("Accept-Language", "en-us")
response = urllib2.urlopen(request).read()

print encoding
print fromstring(response).text_content()

出力:

utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)

この問題を解決するにはどうすればよいですか? 他のいくつかのページでこれを行いたいので、個別にエンコードしたくないことに注意してください。

アップデート:

たぶん、ここで何か他のことが起こっています。ターミナルでこのスクリプトを実行すると、正しい出力が得られますが、SublimeText 内で実行すると、UnicodeEncodeError が発生します... ¿

更新 2:

この出力でファイルを作成するときにも発生します。.encode('ascii', 'replace')動作していますが、より一般的な解決策が必要です。

よろしく

4

3 に答える 3

5

文字列を repr() でラップしてみてください。 この記事が役立つかもしれません。

print repr(fromstring(response).text_content())
于 2012-06-22T02:49:27.897 に答える
3

編集で述べたようにファイルに書き出す限り、コーデックモジュールでファイルを開くことをお勧めします。

import codecs
output_file = codecs.open('filename.txt','w','utf8')

SublimeTextはわかりませんが、出力をASCIIとして読み取ろうとしているようです。そのため、エンコードエラーが発生します。

于 2012-06-22T03:23:19.897 に答える
0

あなたの最初の更新に基づいて、端末は Python に utf-8 を出力するように指示し、SublimeText は ascii を想定していることを明確にしました。したがって、SublimeText で適切な設定を見つけることが解決策になると思います。

ただし、SublimeText が期待するものを変更できない場合はencode、別の関数で既に行ったように関数を使用することをお勧めします。

def smartprint( text ) :
    if sys.stdout.encoding == None :
        print text
    else :
        print text.encode( sys.stdout.encoding , 'replace' )

の代わりにこの関数を使用できますprint。SublimeText で実行したときのプログラムの出力は、ターミナルとは異なることに注意してください。アクセント付きの文字は、replaceこのコードが SublimeText で実行されるとアクセントが失われるため、たとえばéとして表示されeます。

于 2012-06-21T20:51:22.450 に答える