【Beautifulsoup】如何在网页中经过中文text获取标签


说明:一般咱们所看到的网页几乎都是utf-8编码,这点在网页源码中搜索“charset”能够看到。也能够点击此处的方法查看,咱们在使用beautifulsoup的时候,不免会有使用text属性来查找标签的时候,英文还好,查找中文的时候(bs.find(text=('钟表')),返回的结果几乎都是None,下面说说这个问题。html

当运行如下代码时:python

html = urllib2.urlopen(url)
bs = BeautifulSoup(html,'lxml')

网页源码将经历一次编码转换,它的原编码是utf8,咱们的bs在使用lxml库解析网页时会将网页源码解码为Unicode编码数据,bs的默认解码方式是utf8,不少时候不须要改,此时代码获得的bs对象已是解码后的Unicode编码的数据了,当咱们接着运行如下代码时:windows

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的数据后,会直接进行解析,无需转码。url

r = requests.get('http://www.baidu.com',verify=False)
e = chardet.detect(r.content)['encoding']  #检测源码的编码类型,进行对应解码
r.encoding = e
print r.text