私の背景はPerlですが、私はPythonとBeautifulSoupを新しいプロジェクトに使っています。Python、.format()、UTF-8
この例では、1つのページに含まれるリンクターゲットとリンクテキストを抽出して表示しようとしています。ここでは、ソースです:
table_row = u'<tr><td>{}</td><td>{}</td></tr>'.encode('utf-8')
link_text = unicode(link.get_text()).encode('utf-8')
link_target = link['href'].encode('utf-8')
line_out = unicode(table_row.format(link_text, link_target))
.encodeするすべてのものを明示的に呼び出し(「UTF-8」)は、この作品を作るために私の試みですが、彼らは助けていないようだ - 私が完全だと考えられますPython 2.7がどのようにUnicode文字列を扱うのかを誤解しています。
とにかく。これはURLでU + 2013に出会うまでうまく動作します(本当にそうです)。その時点でアウトと、それは爆弾:
Traceback (most recent call last):
File "./test2.py", line 30, in <module>
line_out = unicode(table_row.encode('utf-8').format(link_text, link_target.encode('utf-8')))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 79: ordinal not in range(128)
おそらく.format()、でも、Unicode文字列に適用される、愚かな-buggersを演奏し、.decode()操作をやろうとしています。そして、ASCIIがデフォルトであるので、それを使用しています。もちろん、U + 2013をASCII文字にマップすることはできません。
オプションは、それを削除するか、別のものに変換するようですしかし、私が欲しいのは単にそれを保存することだけです。最終的に(ちょっとしたテストケースです)、私はクリック可能なリンクを表示する必要があります。
BS3のドキュメントでは、デフォルトのエンコーディングをASCIIからUTF-8に変更することを提案していますが、同様の質問のコメントを読むことは、辞書を荒らしてしまうので本当に悪い考えです。
代わりにPython 3.2を使用するのは、このプロジェクトの一環として検討しているDjangoを使用していないということですが、この作業をきれいにする方法はありますか?それは1つですので、トレースバックからの一つです
line_out = unicode(table_row.encode('utf-8').format(link_text, link_target.encode('utf-8')))
line_out = unicode(table_row.format(link_text, link_target))
最初
VS:
出力に(所望の符号化)の入力とエンコードに(ユニコードに)デコード、親指の基本的なルールとして:
ここですべてを説明し、私はPyConで与えたプレゼンテーションです。 – monkut