python 检测文件编码_[常用] 在Python中检测网页编码
[常用] 在Python中檢測網(wǎng)頁編碼
在使用Python抓取網(wǎng)頁并進(jìn)行分析時出現(xiàn)這個錯誤:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6
原因是部分中文網(wǎng)站編碼不是utf8, 因此需要進(jìn)行編碼判斷
問題描述:
在引入編碼自動識別前, 我們有兩種途徑獲取網(wǎng)頁的編碼信息:
其一、通過服務(wù)器返回的 header 里的 charset 變量獲取
其二、通過頁面里的 meta 信息獲取
正常情況下, 如果服務(wù)器或者頁面有提供這兩個參數(shù), 而且參數(shù)是正確的, 那我們抓取網(wǎng)頁時就不存在編碼的問題了.
但是現(xiàn)實總是會難為我們這些程序員, 抓取網(wǎng)頁時, 經(jīng)常會出現(xiàn)以下幾種情況:
這兩個參數(shù)缺失了
這兩個參數(shù)雖然都提供了,但是不一致
這兩個參數(shù)提供了,但是與網(wǎng)頁實際的編碼不一致
為了盡可能的自動的獲取所有網(wǎng)頁的編碼,所以引入了編碼自動識別
Chardet
搜索chardet馬上就找到了Python的chardet第三方庫
可以通過pip安裝
pip install chardet
主頁描述:
chardet guesses the encoding of text files.
Detects...
ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
EUC-JP, SHIFT_JIS, ISO-2022-JP (Japanese)
EUC-KR, ISO-2022-KR (Korean)
KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
ISO-8859-2, windows-1250 (Hungarian)
ISO-8859-5, windows-1251 (Bulgarian)
windows-1252 (English)
ISO-8859-7, windows-1253 (Greek)
ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
TIS-620 (Thai)
Requires Python 2.1 or later.
我使用的是Python 2.7.X
網(wǎng)頁編碼判斷:
import chardet
import urllib2
#可根據(jù)需要,選擇不同的數(shù)據(jù)
html = urllib2.urlopen('http://www.zol.com.cn/').read()
print(chardet.detect(html))
運(yùn)行結(jié)果:
{'confidence': 0.99, 'encoding': 'GB2312'}
chardet.detect()返回字典, 其中confidence是檢測精確度, encoding是編碼形式
另一種方式:
import urllib2
from chardet.universaldetector import UniversalDetector
html = urllib2.urlopen('http://www.zol.com.cn/')
#創(chuàng)建一個檢測對象
detector = UniversalDetector()
for line in html.readlines():
#分塊進(jìn)行測試,直到達(dá)到閾值
detector.feed(line)
if detector.done: break
#關(guān)閉檢測對象
detector.close()
html.close()
#輸出檢測結(jié)果
print detector.result
運(yùn)行結(jié)果:
{'confidence': 0.99, 'encoding': 'GB2312'}
如果要對一個大文件進(jìn)行編碼識別, 使用后一種方法, 可以只讀一部分去判別編碼方式, 從而提高檢測速度.
BeautifulSoup4 UnicodeDammit
可以使用BeautifulSoup4的UnicodeDammit模塊
from bs4 import UnicodeDammit
dammit = UnicodeDammit("Sacr\xc3\xa9bleu!")
print(dammit.unicode_markup)
# Sacré bleu!
dammit.original_encoding
# 'utf-8'
總結(jié)
不管使用上面哪種模塊, 都不能保證百分百正確...部分網(wǎng)站太吭爹了...
下面是我最后的寫法, 結(jié)合兩種方式, 之前測試出現(xiàn)亂碼的網(wǎng)站都能檢測出來了, 就是代碼看著不是很干凈:
參考文檔
總結(jié)
以上是生活随笔為你收集整理的python 检测文件编码_[常用] 在Python中检测网页编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gnss、rtk定位原理
- 下一篇: 利用阿里云大数据产品建设数据中台?