Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 569|回复: 0

python 解决抓取网页中的中文显示乱码问题

[复制链接]
  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 789 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722638
    发表于 2021-5-6 05:53:07 | 显示全部楼层 |阅读模式

    关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换、还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明。

    网络爬虫出现乱码的原因

    源网页编码和爬取下来后的编码格式不一致。
    如源网页为gbk编码的字节流,而我们抓取下后程序直接使用utf-8进行编码并输出到存储文件中,这必然会引起乱码 即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码; 此时再进行统一的字符编码也就不会出现乱码了

    注意区分

    • 源网编码A、
    • 程序直接使用的编码B、
    • 统一转换字符的编码C。

    乱码的解决方法

    确定源网页的编码A,编码A往往在网页中的三个位置

    1.http header的Content-Type
    获取服务器 header 的站点可以通过它来告知浏览器一些页面内容的相关信息。 Content-Type 这一条目的写法就是 "text/html; charset=utf-8"。 

    2.meta charset

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

    3.网页头中Document定义

    <script type="text/javascript"> 
    if(document.charset){ 
     alert(document.charset+"!!!!"); 
     document.charset = 'GBK'; 
     alert(document.charset); 
    } 
    else if(document.characterSet){ 
     alert(document.characterSet+"????"); 
     document.characterSet = 'GBK'; 
     alert(document.characterSet); 
    } 

    在获取源网页编码时,依次判断下这三部分数据即可,从前往后,优先级亦是如此。
    以上三者中均没有编码信息 一般采用chardet等第三方网页编码智能识别工具来做

    安装: pip install chardet

    官方网站: http://chardet.readthedocs.io/en/latest/usage.html

    Python chardet 字符编码判断

    使用 chardet 可以很方便的实现字符串/文件的编码检测 虽然HTML页面有charset标签,但是有些时候是不对的。那么chardet就能帮我们大忙了。
    chardet实例

    import urllib 
    rawdata = urllib.urlopen('http://www.baidu.com/').read() 
    import chardet 
    chardet.detect(rawdata) 
    {'confidence': 0.99, 'encoding': 'GB2312'} 

    chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。

    在开发自用爬虫过程中如何处理汉字编码?
    下面所说的都是针对python2.7,如果不加处理,采集到的都是乱码,解决的方法是将html处理成统一的utf-8编码 遇到windows-1252编码,属于chardet编码识别训练未完成

    import chardet 
    a='abc'
    type(a) 
    str
    chardet.detect(a) 
    {'confidence': 1.0, 'encoding': 'ascii'} 
      
      
    a =""
    chardet.detect(a) 
    {'confidence': 0.73, 'encoding': 'windows-1252'} 
    a.decode('windows-1252') 
    u'\xe6\u02c6\u2018'
    chardet.detect(a.decode('windows-1252').encode('utf-8')) 
    type(a.decode('windows-1252')) 
    unicode
    type(a.decode('windows-1252').encode('utf-8')) 
    str
    chardet.detect(a.decode('windows-1252').encode('utf-8')) 
    {'confidence': 0.87625, 'encoding': 'utf-8'} 
      
      
    a ="我是中国人"
    type(a) 
    str
    {'confidence': 0.9690625, 'encoding': 'utf-8'} 
    chardet.detect(a) 
    # -*- coding:utf-8 -*- 
    import chardet 
    import urllib2 
    #抓取网页html 
    html = urllib2.urlopen('http://www.baidu.com/').read() 
    print html 
    mychar=chardet.detect(html) 
    print mychar 
    bianma=mychar['encoding'] 
    if bianma == 'utf-8' or bianma == 'UTF-8': 
     html=html.decode('utf-8','ignore').encode('utf-8') 
    else: 
     html =html.decode('gb2312','ignore').encode('utf-8') 
    print html 
    print chardet.detect(html) 

    python代码文件的编码
    py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行添加编码指示:

    # -*- coding:utf-8 -*- 
      
    print '中文'

    像上面那样直接输入的字符串是按照代码文件的编码'utf-8'来处理的
    如果用unicode编码,以下方式:

    s1 = u'中文' #u表示用unicode编码方式储存信息

    decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。
    encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

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

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-9-6 20:18 , Processed in 1.006131 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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