说明:通常我们所看到的网页几乎都是utf-8编码,这点在网页源码中搜索“charset”可以看到。也可以点击此处的方法查看,我们在使用beautifulsoup的时候,难免会有使用text属性来查找标签的时候,英文还好,查找中文的时候(bs.find(text=('钟表')),返回的结果几乎都是None,下面说说这个问题。
当运行以下代码时:
html = urllib2.urlopen(url)
bs = BeautifulSoup(html,'lxml')
网页源码将经历一次编码转换,它的原编码是utf8,我们的bs在使用lxml库解析网页时会将网页源码解码为Unicode编码数据,bs的默认解码方式是utf8,很多时候不需要改,此时代码得到的bs对象已经是解码后的Unicode编码的数据了,当我们接着运行以下代码时:
t = bs.find(text=(u"钟表品牌分类"))print t
若你的代码环境是windows,那你的代码第一行应该有# -*- coding: utf-8 -*-,意思是声明编译器的默认编码是utf8,以支持中文的输入;ok,这样一来我们输入的所有中文都将会是utf8编码,你或许已经明白了,是的,bs对象是Unicode,查找模型是utf8,狗窝里找母猫,当然一无所获。明白了原理,问题就好解决:
t = bs.find(text=(u"钟表品牌分类"))print t
把text文字转为unicode编码的数据即可。若你爬取的网页源码的编码不是utf8,那就在解析的时候指定解码形式:
bs = BeautifulSoup(html.text,'lxml',from_encoding='gb2312')
当然,如果使用的是强大的requests库,那么在使用requests.get(url).text的时候就已经解码为unicode形式的数据了(如果源网页不是utf-8编码则会乱码),下面的代码演示如何得知原网页的编码格式。bs得到unicode的数据后,会直接进行解析,无需转码。
r = requests.get('http://www.baidu.com',verify=False)
e = chardet.detect(r.content)['encoding'] #检测源码的编码类型,进行对应解码
r.encoding = e
print r.text