日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 检测文件编码_[常用] 在Python中检测网页编码

發(fā)布時間:2023/12/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 检测文件编码_[常用] 在Python中检测网页编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[常用] 在Python中檢測網(wǎng)頁編碼

在使用Python抓取網(wǎng)頁并進行分析時出現(xiàn)這個錯誤:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xd6

原因是部分中文網(wǎng)站編碼不是utf8, 因此需要進行編碼判斷

問題描述:

在引入編碼自動識別前, 我們有兩種途徑獲取網(wǎng)頁的編碼信息:

其一、通過服務器返回的 header 里的 charset 變量獲取

其二、通過頁面里的 meta 信息獲取

正常情況下, 如果服務器或者頁面有提供這兩個參數(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))

運行結(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():

#分塊進行測試,直到達到閾值

detector.feed(line)

if detector.done: break

#關(guān)閉檢測對象

detector.close()

html.close()

#輸出檢測結(jié)果

print detector.result

運行結(jié)果:

{'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'

總結(jié)

不管使用上面哪種模塊, 都不能保證百分百正確...部分網(wǎng)站太吭爹了...

下面是我最后的寫法, 結(jié)合兩種方式, 之前測試出現(xiàn)亂碼的網(wǎng)站都能檢測出來了, 就是代碼看著不是很干凈:

參考文檔

總結(jié)

以上是生活随笔為你收集整理的python 检测文件编码_[常用] 在Python中检测网页编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。