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' <li  ><a href="(.+)">(.+)</a></li>'
    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分析淘宝首页的内容。其中有一段如下,抓取下面格式的内容,网址+中文标题。

<ul class="nav-bd"><li class="pipe">|</li>
  
        <li  ><a href="http://trip.taobao.com/?spm=1.7281509.a214dau.4">阿里旅行</a></li>
        <li  ><a href="http://sf.taobao.com/?spm=1.7281509.a214dau.5">司法拍卖</a></li>
        <li  ><a href="http://www.etao.com/?spm=1.7281509.a214dau.6&tb_lm_id=t_zdh">一淘</a></li>
        <li  ><a href="http://3c.tmall.com/?spm=1.7281509.a214dau.7">电器城</a></li>
        <li  ><a href="http://www.taobao.com/go/chn/hitao/top.php?spm=1.7281509.a214dau.8">美妆闪购</a></li>
        <li  ><a href="http://yun.taobao.com/?spm=1.7281509.a214dau.9">阿里小智</a></li>
        <li  ><a href="http://china.chi.taobao.com/?spm=1.7281509.a214dau.10">特色中国</a></li>
      
</ul>
<ul class="nav-ft">

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'<span STYLE=.+\n+(.+)</SPAN></P>\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代码如下所示,部分截取:

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

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

Process finished with exit code 0


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


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


猜你喜欢

转载自blog.csdn.net/koanzhongxue/article/details/44478461