| 
 关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换、还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明。  
网络爬虫出现乱码的原因  
源网页编码和爬取下来后的编码格式不一致。 如源网页为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定义
   
 
  
   
    
    
     
      
      |  
        
         1 
         
       
         2 
         
       
         3 
         
       
         4 
         
       
         5 
         
       
         6 
         
       
         7 
         
       
         8 
         
       
         9 
         
       
         10 
         
       
         11 
          |  
       
        
         
         < 
         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实例  
 
  
   
    
    
     
      
      |  
        
         1 
         
       
         2 
         
       
         3 
         
       
         4 
         
       
         5 
          |  
       
        
         
         import 
         urllib  
          
         
         rawdata  
         = 
         urllib.urlopen( 
         '//www.jb51.net/' 
         ).read()  
          
         
         import 
         chardet  
          
         
         chardet.detect(rawdata)  
          
         
         { 
         'confidence' 
         :  
         0.99 
         ,  
         'encoding' 
         :  
         'GB2312' 
         }  
          
          |  
       
     
     
    
   
  
chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。  
在开发自用爬虫过程中如何处理汉字编码? 下面所说的都是针对python2.7,如果不加处理,采集到的都是乱码,解决的方法是将html处理成统一的utf-8编码 遇到windows-1252编码,属于chardet编码识别训练未完成  
 
  
   
    
    
     
      
      |  
        
         1 
         
       
         2 
         
       
         3 
         
       
         4 
         
       
         5 
         
       
         6 
         
       
         7 
         
       
         8 
         
       
         9 
         
       
         10 
         
       
         11 
         
       
         12 
         
       
         13 
         
       
         14 
         
       
         15 
         
       
         16 
         
       
         17 
         
       
         18 
         
       
         19 
         
       
         20 
         
       
         21 
         
       
         22 
         
       
         23 
         
       
         24 
         
       
         25 
         
       
         26 
         
       
         27 
         
       
         28 
         
       
         29 
         
       
         30 
         
       
         31 
         
       
         32 
         
       
         33 
         
       
         34 
         
       
         35 
         
       
         36 
         
       
         37 
         
       
         38 
         
       
         39 
         
       
         40 
         
       
         41 
         
       
         42 
          |  
       
        
         
         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)  
          
         
          
          
         
         import 
         chardet  
          
         
         import 
         urllib2  
          
         
          
          
         
         html  
         = 
         urllib2.urlopen( 
         '//www.jb51.net/' 
         ).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。需要在代码文件的第一行添加编码指示:  
 
像上面那样直接输入的字符串是按照代码文件的编码'utf-8'来处理的 如果用unicode编码,以下方式:  
s1 = u'中文' #u表示用unicode编码方式储存信息  
decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。 encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。  
更多内容请参考专题《python爬取功能汇总》进行学习。  
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。  |