|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
先看小甲鱼的帖子:
一次性解决你所有的编码检测问题
http://bbs.fishc.com/thread-66086-1-1.html
(出处: 鱼C论坛)
鱼油们平时做爬虫抓网页,都会碰到字符编码转换的问题,很多人搞不清应该用什么编码格式来处理抓到的 网页。
通常,网页的字符编码以 charset="xxx" 属性的形式出现在 2 个地方:
1、http 响应头 中 Content-Type 域,
2、html 文档的 head 部的 meta 标签中。
例如,本论坛的
响应头:
html:
需要注意的是,
http 响应头 中 不一定有charset 属性
html 文档 多数情况下会有 charset 属性
所以,通常都是在 html文档中查看 charset,就知道 网页的字符编码格式了。
参考资料:
HTTP 响应头信息
http://www.runoob.com/http/http-header-fields.html
HTML <meta> 标签
http://www.runoob.com/tags/tag-meta.html
下面是一个简单的示例:
- import requests as req
- import chardet
- import re
- def my_chardet(url=None):
- print(url)
- rsp=req.get(url)
- # headers
- print('headers:C-T=',rsp.headers['Content-Type'])
- # bytes
- charset = rsp.content.lower().split(b'head>',2)[1]\
- .split(b'content-type')[1]\
- .split(b'>')[0]\
- .split(b'charset=')[1]\
- .split(b'"')[0]\
- .decode()
- print('meta:charset=',charset)
- # re
- ptnHead = re.compile(b'<head>(.*?)</head>',re.I|re.S)
- ptnCharset = re.compile(b'<meta[^<>]*"content-type"[^<>]*charset=(.*?)"',
- re.I|re.S)
- re_head = ptnHead.findall(rsp.content)[0]
- re_charset = ptnCharset.findall(re_head)[0].decode()
- print('re_charset=',re_charset)
- # chardet
- cd= chardet.detect(rsp.content)
- print('chardet=',cd)
- print()
- if __name__ == '__main__':
- my_chardet(url='http://www.fishc.com')
- my_chardet(url='http://bbs.fishc.com')
- my_chardet(url='http://www.sina.com')
- my_chardet(url='http://www.baidu.com')
复制代码
运行结果:
- http://www.fishc.com
- headers:C-T= text/html
- meta:charset= utf-8
- re_charset= utf-8
- chardet= {'encoding': 'utf-8', 'confidence': 0.99}
- http://bbs.fishc.com
- headers:C-T= text/html; charset=gbk
- meta:charset= gbk
- re_charset= gbk
- chardet= {'encoding': 'GB2312', 'confidence': 0.99}
- http://www.sina.com
- headers:C-T= text/html
- meta:charset= utf-8
- re_charset= utf-8
- chardet= {'encoding': 'utf-8', 'confidence': 0.99}
- http://www.baidu.com
- headers:C-T= text/html; charset=utf-8
- meta:charset= utf-8
- re_charset= utf-8
- chardet= {'encoding': 'utf-8', 'confidence': 0.99}
复制代码
可以看到, chardet 模块的测试结果并不是100%可靠的~
在没有其他可靠方法的情况下,就用 chardet 把,总比没有好~~
|
评分
-
查看全部评分
|