鱼C论坛

 找回密码
 立即注册
查看: 3015|回复: 2

[技术交流] 爬虫,分析网页字符集和字符编码的基本技巧。

[复制链接]
发表于 2016-8-15 13:14:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先看小甲鱼的帖子:
一次性解决你所有的编码检测问题
http://bbs.fishc.com/thread-66086-1-1.html
(出处: 鱼C论坛)



                               
登录/注册后可看大图

                               
登录/注册后可看大图

鱼油们平时做爬虫抓网页,都会碰到字符编码转换的问题,很多人搞不清应该用什么编码格式来处理抓到的 网页。

通常,网页的字符编码以 charset="xxx" 属性的形式出现在 2 个地方:
1、http 响应头 中 Content-Type 域,
2、html 文档的 head 部的 meta 标签中。
例如,本论坛的
响应头:
charset-rsp.PNG

html:
charset.PNG

需要注意的是,
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


                               
登录/注册后可看大图

                               
登录/注册后可看大图


下面是一个简单的示例:
  1. import requests as req
  2. import chardet
  3. import re

  4. def my_chardet(url=None):
  5.     print(url)

  6.     rsp=req.get(url)

  7.     # headers
  8.     print('headers:C-T=',rsp.headers['Content-Type'])

  9.     # bytes
  10.     charset = rsp.content.lower().split(b'head>',2)[1]\
  11.                                  .split(b'content-type')[1]\
  12.                                  .split(b'>')[0]\
  13.                                  .split(b'charset=')[1]\
  14.                                  .split(b'"')[0]\
  15.                                  .decode()
  16.     print('meta:charset=',charset)

  17.     # re
  18.     ptnHead = re.compile(b'<head>(.*?)</head>',re.I|re.S)
  19.     ptnCharset = re.compile(b'<meta[^<>]*"content-type"[^<>]*charset=(.*?)"',
  20.                             re.I|re.S)
  21.     re_head = ptnHead.findall(rsp.content)[0]
  22.     re_charset = ptnCharset.findall(re_head)[0].decode()
  23.     print('re_charset=',re_charset)

  24.     # chardet
  25.     cd= chardet.detect(rsp.content)
  26.     print('chardet=',cd)
  27.     print()

  28. if __name__ == '__main__':
  29.     my_chardet(url='http://www.fishc.com')
  30.     my_chardet(url='http://bbs.fishc.com')
  31.     my_chardet(url='http://www.sina.com')
  32.     my_chardet(url='http://www.baidu.com')
复制代码


运行结果:
  1. http://www.fishc.com
  2. headers:C-T= text/html
  3. meta:charset= utf-8
  4. re_charset= utf-8
  5. chardet= {'encoding': 'utf-8', 'confidence': 0.99}

  6. http://bbs.fishc.com
  7. headers:C-T= text/html; charset=gbk
  8. meta:charset= gbk
  9. re_charset= gbk
  10. chardet= {'encoding': 'GB2312', 'confidence': 0.99}

  11. http://www.sina.com
  12. headers:C-T= text/html
  13. meta:charset= utf-8
  14. re_charset= utf-8
  15. chardet= {'encoding': 'utf-8', 'confidence': 0.99}

  16. http://www.baidu.com
  17. headers:C-T= text/html; charset=utf-8
  18. meta:charset= utf-8
  19. re_charset= utf-8
  20. chardet= {'encoding': 'utf-8', 'confidence': 0.99}
复制代码


可以看到, chardet 模块的测试结果并不是100%可靠的~
在没有其他可靠方法的情况下,就用 chardet 把,总比没有好~~

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
膜法记者 + 2 + 2 + 1 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-15 15:16:02 | 显示全部楼层
看看看~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-16 15:08:20 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 03:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表