2012-07-21 7 views
5

私はずっと長い間エンコーディングに苦労していましたが、今日はメンタルブロックを大きく開いてしまいたいと思います。Pythonを使ってエンコードを処理する方法リクエストライブラリ

今、私はRequestsを使って多数のウェブサイトをスクラップし、HTTPヘッダを使ってページが使用しているエンコーディングを把握しています。chardetのサイトのヘッダ欠けている。そこからダウンロードしたバイトコードをデコードし、r.textのユニコードオブジェクトを手助けします。

すべていいです。

print foo.encode('utf-8') 

問題は私が行うときということです:私は混乱している

しかし、そこから私は、テキスト上のいくつかの作業を行い、その後、標準出力にそれをプリントアウトし、私は印刷するときのエンコーディングを提供することですそれは、印刷されたものが台無しになっていることです。以下では、私は、単語「の判断」と「基準」の間emdashを得ることを期待:

Declaratory judgmentsStandard of review. 

は代わりに、私はそれの4つの小さな番号の箱型のものを取得します。もちろん、ここに表示されていないようですが、私は私がしなければ、私が何を得るに相当する数字が0097だと思う:

repr(foo) 
u'Declaratory judgments\x97Standard of review.' 

だから、その種類のが理にかなっているが、どこemdashですか?

プロセスがに沸く:

  1. 要求はページをダウンロードし、インテリジェントIがUTF-8と印刷にそれをエンコード
  2. が、私はそれで動作するUnicodeオブジェクトにテキストをデコードそれを出す。

問題はどこですか?これは私にmythical unicode sandwichのように聞こえるが、明らかに何かが欠けている。

答えて

4

あなたは何か奇妙なことをしています。 \x97は、cp1252エンコードのemdashです。 Unicode文字列では、それはU+0097 END OF GUARDED AREAです。どういうわけか、Unicodeとしてcp1252バイトを読み込んでいます。この状態にあなたを導いたコードをさらに表示し、深く掘り下げることができます。

PS:Unicodeサンドウィッチはほとんど神話ではありませんが、それは努力するのに理想的です! :)

+0

あなたはそれを釘付けにした。 [ページ](http://www.sconet.state.oh.us/ROD/docs/default.asp?Page=1&Sort=docdecided%20DESC&PageSize=25&Source=0&iaFilter=2012&ColumnMask=669)が問題です。 Chardetがそれを 'ISO-8859-1'として認識するようにエンコーディングを宣言するのではなく、Requestsはそのようにデコードします。それで、私がutf-8としてエンコードすると、もちろんそれも失敗します。あなたは頭の上からこれをどのように知っていましたか?私はこれを将来避けたいですか? – mlissner

+0

ああ、別の質問... FirefoxとChromeはこのページをiso-8859-1としても検出しますが、emdashを完全に表示します!彼らのトリックは何ですか? – mlissner

+0

長い経験から、\ x9Xでエンコードされたemdashなどの文字はおそらくcp1252であることがわかります。ウィキペディアでそれを見ると、cp1252はあなたが見せたバイトをあなたが期待したキャラクターにマップすることを確認しました。 cp1252は実際にはiso8859-1のスーパーセットであり、印刷可能な文字はiso8859-1にはありません。したがって、ブラウザが8859-1を使用していると言えば、実際にはcp1252を使用するのはなぜですか、なぜなら、単に文字数を増やすだけなのです。 –

関連する問題