python 检测文件编码_[常用] 在Python中检测网页编码
[常用] 在Python中檢測網頁編碼
在使用Python抓取網頁并進行分析時出現這個錯誤:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6
原因是部分中文網站編碼不是utf8, 因此需要進行編碼判斷
問題描述:
在引入編碼自動識別前, 我們有兩種途徑獲取網頁的編碼信息:
其一、通過服務器返回的 header 里的 charset 變量獲取
其二、通過頁面里的 meta 信息獲取
正常情況下, 如果服務器或者頁面有提供這兩個參數, 而且參數是正確的, 那我們抓取網頁時就不存在編碼的問題了.
但是現實總是會難為我們這些程序員, 抓取網頁時, 經常會出現以下幾種情況:
這兩個參數缺失了
這兩個參數雖然都提供了,但是不一致
這兩個參數提供了,但是與網頁實際的編碼不一致
為了盡可能的自動的獲取所有網頁的編碼,所以引入了編碼自動識別
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
網頁編碼判斷:
import chardet
import urllib2
#可根據需要,選擇不同的數據
html = urllib2.urlopen('http://www.zol.com.cn/').read()
print(chardet.detect(html))
運行結果:
{'confidence': 0.99, 'encoding': 'GB2312'}
chardet.detect()返回字典, 其中confidence是檢測精確度, encoding是編碼形式
另一種方式:
import urllib2
from chardet.universaldetector import UniversalDetector
html = urllib2.urlopen('http://www.zol.com.cn/')
#創建一個檢測對象
detector = UniversalDetector()
for line in html.readlines():
#分塊進行測試,直到達到閾值
detector.feed(line)
if detector.done: break
#關閉檢測對象
detector.close()
html.close()
#輸出檢測結果
print detector.result
運行結果:
{'confidence': 0.99, 'encoding': 'GB2312'}
如果要對一個大文件進行編碼識別, 使用后一種方法, 可以只讀一部分去判別編碼方式, 從而提高檢測速度.
BeautifulSoup4 UnicodeDammit
可以使用BeautifulSoup4的UnicodeDammit模塊
from bs4 import UnicodeDammit
dammit = UnicodeDammit("Sacr\xc3\xa9bleu!")
print(dammit.unicode_markup)
# Sacré bleu!
dammit.original_encoding
# 'utf-8'
總結
不管使用上面哪種模塊, 都不能保證百分百正確...部分網站太吭爹了...
下面是我最后的寫法, 結合兩種方式, 之前測試出現亂碼的網站都能檢測出來了, 就是代碼看著不是很干凈:
參考文檔
總結
以上是生活随笔為你收集整理的python 检测文件编码_[常用] 在Python中检测网页编码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gnss、rtk定位原理
- 下一篇: 人工智能:python 实现 第十章,N