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

   1.存在乱码的主要问题是文字编码的问题。有些网站的页面是utf-8, gb2312等编码格式,python 系统默认的编码额格式一般为utf-8 格式。如果网页的编码格式为utf-8 ,系统默认的也是utf-8 ,那么显示就不会有太大的问题。但是如果网页是 GB2312 的,用uft-8 显示,则会出现乱码的问题。

2.python 库 chartdet 可以用来检测字符串的编码方式。

print sys.getfilesystemencoding()
print 'Html is encoding by : %',chardet.detect(GetHtml(url))

第一行用来查看系统的默认编码方式,第二行,用来检测获取的网页中的编码方式。


3.示例1. 网页为GB2312,

__author__ = 'xiaolong'
# -*- coding:utf-8 -*- #
import urllib
import re
import sys
import chardet

def GetHtml( url):
    page = urllib.urlopen(url)
    contex = page.read()
    return contex


def GetLink(html):
    reg = r' 
  • (.+)
  • ' imgre = re.compile(reg) imglist = re.findall(imgre,html) return imglist url = "http://www.taobao.com/" get = GetLink(GetHtml(url).decode('GB2312').encode('utf-8')) print sys.getfilesystemencoding() print 'Html is encoding by : %',chardet.detect(GetHtml(url)) for each in get: for list in each: print list, print '\n'
    3.1分析淘宝首页的内容。其中有一段如下,抓取下面格式的内容,网址+中文标题。

    
    

    3.2python处理完毕的控制台显示如下图所示:

    /usr/bin/python2.7 /home/xiaolong/PycharmProjects/GetJpg/function.py
    UTF-8
    Html is encoding by : % {'confidence': 0.99, 'encoding': 'GB2312'}
    http://trip.taobao.com/?spm=1.7281509.a214dau.4 阿里旅行 
    
    http://sf.taobao.com/?spm=1.7281509.a214dau.5 司法拍卖 
    
    http://www.etao.com/?spm=1.7281509.a214dau.6&tb_lm_id=t_zdh 一淘 
    
    http://3c.tmall.com/?spm=1.7281509.a214dau.7 电器城 
    
    http://www.taobao.com/go/chn/hitao/top.php?spm=1.7281509.a214dau.8 美妆闪购 
    
    http://yun.taobao.com/?spm=1.7281509.a214dau.9 阿里小智 
    
    http://china.chi.taobao.com/?spm=1.7281509.a214dau.10 特色中国 
    
    
    Process finished with exit code 0

    我们可以看到Python控制台输出:系统默认编码方式为UTF-8,读取的Html网页内容编码方式为GB2312,python程序中
    GetHtml(url).decode('GB2312').encode('utf-8')
    就是对读取到的网页先进行GB2312 的解码, 在用 utf-8 编码,才能以utf -8 的系统中正确的显示汉字。

    若不进行编码转换,则控制台输出如下:

    /usr/bin/python2.7 /home/xiaolong/PycharmProjects/GetJpg/function.py
    UTF-8
    Html is encoding by : % {'confidence': 0.99, 'encoding': 'GB2312'}
    http://trip.taobao.com/?spm=1.7281509.a214dau.4 �������� 
    
    http://sf.taobao.com/?spm=1.7281509.a214dau.5 ˾������ 
    
    http://www.etao.com/?spm=1.7281509.a214dau.6&tb_lm_id=t_zdh һ�� 
    
    http://3c.tmall.com/?spm=1.7281509.a214dau.7 ������ 
    
    http://www.taobao.com/go/chn/hitao/top.php?spm=1.7281509.a214dau.8 ��ױ���� 
    
    http://yun.taobao.com/?spm=1.7281509.a214dau.9 ������ 
    
    http://china.chi.taobao.com/?spm=1.7281509.a214dau.10 ��ɫ�й� 
    
    
    Process finished with exit code 0
    

    4.示例2,系统默认编码utf-8,网页编码 utf-8,汉字不用转码,正常显示

    __author__ = 'xiaolong'
    # -*- coding:utf-8 -*- #
    import urllib
    import re
    import sys
    import chardet
    
    def GetHtml( url):
        page = urllib.urlopen(url)
        contex = page.read()
        return contex
    
    def GetLink(html):
        reg = r'

    \n' imgre = re.compile(reg) imglist = re.findall(imgre,html) return imglist url = "http://blog.sina.com.cn/s/blog_538268a00102veui.html?tj=1" get = GetLink(GetHtml(url)) print 'System default encoding: ',sys.getfilesystemencoding() print 'Html is encoding by : %',chardet.detect(GetHtml(url)) for each in get: print each

    4.1 这个示例2中是读取新浪博客的一片文章,其html代码如下所示,部分截取:

    一次研讨会上有学者让我谈谈中国外交的新特点,我说了三个词儿:大了,硬了,活了。王岐山访美,更像是一盘大棋,显示中美在包括反腐在内等涉及诸多敏感问题上的合作。有必要就此再聊下。

    大了,很好理解,就是说以前的中国外交是外交部的外交,而现在外交和经济、军事、国家安全的联系更加紧密。外交部的外交,更重视双边外交系统的对接,而今各种事务交织在一起,格局需要够大才可以推进。比如说抓捕贪官的猎狐行动,这次王岐山访美肯定要细谈这方面的合作。这就是大外交,需要外交、司法系统携手,和国外相关机构达成合作,共同抓捕贪官归案。而国家安全委员会的构架,更是外交、内政协调的机构。

    硬了,就是说更加敢作敢为。对日本,对菲律宾,果敢地亮出态度。尤其是日本,在世界范围内死磕,显示出近年来少有的意志。在维护国家利益方面,更是出手果断,向南苏丹派驻军队,显示出维护海外经济利益的决心。在联合国层面,态度更加坚决,敢于说不,敢于支持,不再是永远的弃权。

    活了,就是不再拘泥于一些过时的原则,不再拘泥于是友是敌,而是根据实际情况,全方位发展和各国的友好关系。中国外交灵活的最明显例子就是对朝鲜。作为中国的同志加兄弟,朝鲜多年来对中国表现出不尊重的态度,中国新一届领导开始执政后,不访问朝鲜,而是访问韩国,大力发展和韩国的友好关系,这短期内可能让朝鲜不满,但长期看有利于中国在东北亚变局中的主导作用。

    这三个特点是既成事实,不能简单说这样好还是不好。如果理性地分析就会发现,在外交的战略层面,中国依然有诸多模糊不清之处。

    首先,在外交指导思想方面,是固守韬光养晦还是强调有所作为?这两者当然并不矛盾,但有所作为重点在哪些方面?是不是别给外界中国秀肌肉的感觉?这都需要通盘考虑。

    其次,在外交具体行为方面,是继续恪守主权神圣不可侵犯原则,还是部分地认同人权高于主权?我想短期内中国不会改变,但有些具体案例,如伊拉克内乱给中国造成损失如何应对,确实需要行为准则方面给予指导。

    第三,在大国关系方面,是和西方更加靠近,还是和俄罗斯抱团取暖,这非常关键。我一直认为,中国和俄罗斯无限度地靠近,将是中国的灾难。中国可以在美俄间平衡,但决不能无原则地支持俄罗斯。

    总之,中国外交的新特点表明中国毫无疑问是外交大国,但还不是外交强国,在国际规则的确立、冲突调解方面还不是主导性力量。从外交大国到外交强国,还有很长的路要走。


    4.2 python程序处理后的控制台输出显示:

    /usr/bin/python2.7 /home/xiaolong/PycharmProjects/GetJpg/getblog.py
    System default encoding:  UTF-8
    Html is encoding by : % {'confidence': 0.99, 'encoding': 'utf-8'}
    一次研讨会上有学者让我谈谈中国外交的新特点,我说了三个词儿:大了,硬了,活了。王岐山访美,更像是一盘大棋,显示中美在包括反腐在内等涉及诸多敏感问题上的合作。有必要就此再聊下。
    大了,很好理解,就是说以前的中国外交是外交部的外交,而现在外交和经济、军事、国家安全的联系更加紧密。外交部的外交,更重视双边外交系统的对接,而今各种事务交织在一起,格局需要够大才可以推进。比如说抓捕贪官的猎狐行动,这次王岐山访美肯定要细谈这方面的合作。这就是大外交,需要外交、司法系统携手,和国外相关机构达成合作,共同抓捕贪官归案。而国家安全委员会的构架,更是外交、内政协调的机构。
    硬了,就是说更加敢作敢为。对日本,对菲律宾,果敢地亮出态度。尤其是日本,在世界范围内死磕,显示出近年来少有的意志。在维护国家利益方面,更是出手果断,向南苏丹派驻军队,显示出维护海外经济利益的决心。在联合国层面,态度更加坚决,敢于说不,敢于支持,不再是永远的弃权。
    活了,就是不再拘泥于一些过时的原则,不再拘泥于是友是敌,而是根据实际情况,全方位发展和各国的友好关系。中国外交灵活的最明显例子就是对朝鲜。作为中国的同志加兄弟,朝鲜多年来对中国表现出不尊重的态度,中国新一届领导开始执政后,不访问朝鲜,而是访问韩国,大力发展和韩国的友好关系,这短期内可能让朝鲜不满,但长期看有利于中国在东北亚变局中的主导作用。
    这三个特点是既成事实,不能简单说这样好还是不好。如果理性地分析就会发现,在外交的战略层面,中国依然有诸多模糊不清之处。
    首先,在外交指导思想方面,是固守韬光养晦还是强调有所作为?这两者当然并不矛盾,但有所作为重点在哪些方面?是不是别给外界中国秀肌肉的感觉?这都需要通盘考虑。
    其次,在外交具体行为方面,是继续恪守主权神圣不可侵犯原则,还是部分地认同人权高于主权?我想短期内中国不会改变,但有些具体案例,如伊拉克内乱给中国造成损失如何应对,确实需要行为准则方面给予指导。
    第三,在大国关系方面,是和西方更加靠近,还是和俄罗斯抱团取暖,这非常关键。我一直认为,中国和俄罗斯无限度地靠近,将是中国的灾难。中国可以在美俄间平衡,但决不能无原则地支持俄罗斯。
    总之,中国外交的新特点表明中国毫无疑问是外交大国,但还不是外交强国,在国际规则的确立、冲突调解方面还不是主导性力量。从外交大国到外交强国,还有很长的路要走。
    欢迎关注、转发、评论。
    
    Process finished with exit code 0


    5.总结,对于python抓取网页提取其中的信息过程中出现乱码的问题,主要是由于字符串编码与系统默认的编码不一致,只要处理一致,一般不会出现什么问题。


    ---才开始学习python,感觉其库很强大,希望有兴趣的同学一起学习,希望能加入某个开源项目,在实践中得到学习的提升。


    你可能感兴趣的:(python 解决抓取网页中的中文显示乱码问题)