問題
當使用python屏幕抓取網頁時,必須知道頁面的字符編碼。如果你的字符編碼錯誤,你的輸出會被搞亂。如何在python中下載正確字符集的任何(!)網頁?
人們通常會使用一些基本的技術來檢測編碼。他們要麼使用標題中的字符集,要麼使用元標記中定義的字符集,或者使用encoding detector(它不關心元標記或標題)。 通過僅使用一種這些技術,有時您將得不到與在瀏覽器中相同的結果。
瀏覽器做這種方式:
- Meta標籤始終把標題中定義的優先級(或XML定義)
- 編碼使用時,有沒有在meta標籤定義的字符集
- 如果根本沒有定義編碼,而是編碼檢測的時間。
(嗯......至少這是我相信的樣子大多數瀏覽器做到這一點。文檔非常稀少。)
我正在尋找的是能夠確定該字符集的庫瀏覽器的方式。我相信我不是第一個需要適當解決這個問題的人。
解決方案(我還沒有嘗試過...)
據Beautiful Soup's documentation。
美麗的湯嘗試以下編碼,按優先順序,把你的文件轉換成Unicode:
- 你傳遞的 fromEncoding參數湯 構造的編碼。
- 在文檔本身中發現的編碼:例如,在XML聲明中或(對於HTML文檔)一個http-equiv META標籤。如果Beautiful Soup在文檔中發現這種編碼,它會從頭開始再次解析文檔,並嘗試新編碼。唯一的例外是,如果您明確指定了編碼,並且該編碼實際上起作用:那麼它將忽略它在文檔中找到的任何編碼。
- 通過查看文件的前幾個字節來查看編碼。如果在此階段檢測到編碼 ,則它將是UTF- *編碼的 ,EBCDIC或ASCII之一。
- 一個 編碼嗅探chardet 庫,如果你有它的安裝。
- UTF-8
- 的Windows 1252
您無法下載「任何」頁面,其中包含正確的字符集。當沒有指定正確的字符集時,瀏覽器總是猜錯。我使用FF中的view->編碼菜單來修復每天不正確的猜測。你想做得儘可能好,但放棄正確猜測每一頁。 – 2009-09-30 02:08:12
猜測字符集是邪惡的,首先讓我們陷入這個混亂。如果瀏覽器從未試圖猜測,開發人員將被迫學習HTTP標頭,並始終指定編碼。猜測意味着某個時候你會錯的 – 2009-10-04 01:04:27
gnibbler,猜測是最後的手段 – 2009-10-09 15:46:56