私はずっと長い間エンコーディングに苦労していましたが、今日はメンタルブロックを大きく開いてしまいたいと思います。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ですか?
プロセスがに沸く:
- 要求はページをダウンロードし、インテリジェントIがUTF-8と印刷にそれをエンコード
- が、私はそれで動作するUnicodeオブジェクトにテキストをデコードそれを出す。
問題はどこですか?これは私にmythical unicode sandwichのように聞こえるが、明らかに何かが欠けている。
あなたはそれを釘付けにした。 [ページ](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
ああ、別の質問... FirefoxとChromeはこのページをiso-8859-1としても検出しますが、emdashを完全に表示します!彼らのトリックは何ですか? – mlissner
長い経験から、\ x9Xでエンコードされたemdashなどの文字はおそらくcp1252であることがわかります。ウィキペディアでそれを見ると、cp1252はあなたが見せたバイトをあなたが期待したキャラクターにマップすることを確認しました。 cp1252は実際にはiso8859-1のスーパーセットであり、印刷可能な文字はiso8859-1にはありません。したがって、ブラウザが8859-1を使用していると言えば、実際にはcp1252を使用するのはなぜですか、なぜなら、単に文字数を増やすだけなのです。 –