网页的编码方式是简体中文gb2312 (查看网页源码,可以看到<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />),而python内部的编码方式为unicode,之前的代码是这样的:
contentAll = urllib.urlopen(urlLink).read()
soup = BeautifulSoup.BeautifulSoup(contentAll) #生成BeautifulSoup对象
经过url定位得到html的document对象之后,此时的编码方式为网页文本的编码方式gb2312,
因此在将contentAll送进去生成BeautifulSoup对象之前必须对其进行解码(decode)为unicode,使用的code为gb2312,修改后的代码如下所示:
contentAll = urllib.urlopen(urlLink).read()
soup = BeautifulSoup.BeautifulSoup(contentAll.decode('gb2312','ignore')) #生成BeautifulSoup对象
解码的时候加上ignore参数是因为解码过程中有一部分貌似不能正常解码,加上该参数之后能跳过该部分。
1 源文件编码
在文件头部使用coding声明。告诉python解释器该代码文件所使用的字符集。
在文件头部使用coding声明。告诉python解释器该代码文件所使用的字符集。
#/usr/bin/python
#coding: utf8
#coding: utf8
2 内部编码
代码文件中的字符串,经过decode以后,被转换为统一的unicode格式的内部数据,类似于u''*''。unicode数据可以使用encode函数,再自由转换为其他格式的数据,相当于一个统一的平台。
代码文件中的字符串,经过decode以后,被转换为统一的unicode格式的内部数据,类似于u''*''。unicode数据可以使用encode函数,再自由转换为其他格式的数据,相当于一个统一的平台。
直接输入unicode数据
>>> u''你好''
u''/u4f60/u597d''
>>> u''你好''
u''/u4f60/u597d''
将unicode数据转换为gb2312格式
>>> u''你好''.encode(''gb2312'')
''/xc4/xe3/xba/xc3''
>>> u''你好''.encode(''gb2312'')
''/xc4/xe3/xba/xc3''
将输入的gb2312格式的数据解码为unicode
>>> ''你好''.decode(''gb2312'')
u''/u4f60/u597d''
输入数据的格式取决于所用shell终端的编码设置,本例中为zh_CN
[root@chenzheng python]# echo $LANG
zh_CN
>>> ''你好''.decode(''gb2312'')
u''/u4f60/u597d''
输入数据的格式取决于所用shell终端的编码设置,本例中为zh_CN
[root@chenzheng python]# echo $LANG
zh_CN
解码同时转换为utf8
>>> ''你好''.decode(''gb2312'').encode(''utf8'')
''/xe4/xbd/xa0/xe5/xa5/xbd''
>>> ''你好''.decode(''gb2312'').encode(''utf8'')
''/xe4/xbd/xa0/xe5/xa5/xbd''
3 外部输入的编码
其实这个和在python交互shell中输入的字符串,所遇到的情况基本一样。但程序中常常用到从网络,文件读取的数据,故此单独列出,需要特别注意其编码格式是否于系统要求相符。
其实这个和在python交互shell中输入的字符串,所遇到的情况基本一样。但程序中常常用到从网络,文件读取的数据,故此单独列出,需要特别注意其编码格式是否于系统要求相符。
下面是baidu中文本周金曲榜的链接,返回一个xml文件,编码格式为gb2312
http://box.zhangmen.baidu.com/x?op=4&listid=1
http://box.zhangmen.baidu.com/x?op=4&listid=1
由于xml.etree.EelementTree.parse()不识别gb2312编码,在解析的时候,需要将其转换utf8格式才可以,可以使用下面的函数
def read_page(url):
"""读取gb2312编码的xml文件,转换为utf8格式"""
import urllib
udata = urllib.urlopen(url).read().decode(''gb2312'')
u8data = udata.encode(''utf8'')
return u8data.replace(''gb2312'', ''utf-8'') #简单替换xml文件第一行的encoding属性值
另外,可以使用一个小函数来判断数据的编码格式:
"""读取gb2312编码的xml文件,转换为utf8格式"""
import urllib
udata = urllib.urlopen(url).read().decode(''gb2312'')
u8data = udata.encode(''utf8'')
return u8data.replace(''gb2312'', ''utf-8'') #简单替换xml文件第一行的encoding属性值
另外,可以使用一个小函数来判断数据的编码格式:
def encoding(s):
cl = [''utf8'', ''gb2312'']
for a in cl:
try:
s.decode(a)
return a
except UnicodeEncodeError:
pass
return ''unknown''
cl = [''utf8'', ''gb2312'']
for a in cl:
try:
s.decode(a)
return a
except UnicodeEncodeError:
pass
return ''unknown''