赞
踩
chardet是python的一个第三方编码检测模块,可以检测文件,XML等字符编码的类型。通过pip install chardet安装使用。
from chardet import detect
cs = '中国'
js = 'ジャパン'
ks = '한국인'
cs_ef = detect(cs.decode('utf8').encode('gbk'))
js_ef = detect(js.decode('utf8').encode('euc_jp'))
ks_ef = detect(js.decode('utf8').encode('euc_kr'))
使用也很简单,直接使用detect方法即可。之所以先编号码,再去检测,是想看一看检测结果怎么样。下面是结果。
gbk兼容gb2312,没问题。euc_jp是日文的一种编码方式,韩文的euc_kr倒是被检测为了ibm866,维基百科上866的编码如下所示,貌似有点对不上。
下面再写几个例子试试看效果。检测目标为中日韩美德五个网站编码方式。
from chardet import detect
from urllib import urlopen
urls = [
'http://www.yau.edu.cn/',
'http://www.nhk.or.jp/',
'http://www.kbs.co.kr/',
'http://edition.cnn.com/',
'https://de.yahoo.com/'
]
for url in urls:
resp = urlopen(url)
print (url, detect(resp.read()))
下面是测试结果。
大都是utf8编码的(也理应如此)。那个韩文网站检测为euc_kr编码方式。上面应该再加个验证的,就是顺便把网站的编码从网页上找出来,然后和chardet检测出的结果做个对比。下面加上。
import re
from chardet import detect
from urllib import urlopen
urls = [
'http://www.yau.edu.cn/',
'http://www.nhk.or.jp/',
'http://www.kbs.co.kr/',
'http://edition.cnn.com/',
'https://de.yahoo.com/'
]
p = re.compile(r'<meta[^<]+charset[^>]+>')
for url in urls:
resp = urlopen(url).read()
res = re.search(p, resp)
print (url, detect(resp), res.group())
下面看一看结果如何。
通过结果可知这些网站编码检测的结果与实际结果是一致的。
在chardet源码里的detect函数是这样定义的:
__version__ = "2.3.0"
from sys import version_info
def detect(aBuf):
if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or
(version_info >= (3, 0) and not isinstance(aBuf, bytes))):
raise ValueError('Expected a bytes object, not a unicode object')
from . import universaldetector
u = universaldetector.UniversalDetector()
u.reset()
u.feed(aBuf)
u.close()
return u.result
这意味着在py3中不能使用str字符串,需要使用bytes字符串。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。