2012-07-21 34 views
5

我和編碼掙扎的時間太長了,今天我要打破心理障礙敞開的。如何使用Python來處理編碼請求庫

現在,我正在使用Requests來刮掉一堆網站,並且從我可以告訴它使用HTTP標頭中找出網頁正在使用的編碼,當網站的標頭回落到chardet時缺失。從那裏開始,它解碼下載的字節碼,然後在r.text幫忙給我一個unicode對象。

一切都好。

但是,在我感到困惑的是,從那裏我做了一些文字工作,然後打印出來到標準輸出,提供了編碼當我打印:

print foo.encode('utf-8') 

的問題是,當我做那印刷的東西就搞砸了。在下文中,我期望能獲得這個詞「判斷」和「標準」之間的emdash:

Declaratory judgmentsStandard of review. 

相反,我得到它的四個微小的數字四四方方的東西。它似乎並沒有在這裏顯示,當然了,但我認爲這些數字是0097,這相當於我所得到的,如果我這樣做:

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

所以那種有道理的,但在那裏是我的emdash?

的過程歸結爲:

  1. 請求下載一個網頁和智能文本到Unicode對象
  2. 我用它工作
  3. 我把它編碼成UTF-8和打印解碼出來。

在哪裏的問題?這聽起來像是我的mythical unicode sandwich,但顯然我錯過了一些東西。

回答

4

你在做些奇怪的事情。 \x97cp1252編碼中的一個。在Unicode字符串中,它是U+0097 END OF GUARDED AREA。不知何故,你正在讀取cp1252字節作爲Unicode。顯示更多讓你進入這個狀態的代碼,我們可以深入挖掘。

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」,並且請求將其解碼。然後,當我編碼爲UTF-8,當然也失敗了。你是怎麼知道這一點的?我想在未來避免這種情況? – mlissner 2012-07-21 00:41:37

+0

哦,還有一個問題...... Firefox和Chrome瀏覽器也檢測到這個頁面爲iso-8859-1 ......但它們完美地顯示了emdashes!他們的伎倆是什麼? – mlissner 2012-07-21 00:44:42

+0

長時間的經驗告訴我,在\ x9X編碼的字符如emdash可能是cp1252。查看維基百科確認cp1252將您顯示的字節映射到您期望的字符。 cp1252實際上是iso8859-1的超集,其中iso8859-1沒有可打印的字符。所以當瀏覽器說他們使用8859-1時,他們實際上使用了cp1252,因爲爲什麼不呢,它只是讓更多的字符可打印。 – 2012-07-21 00:46:48