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


说明:通常我们所看到的网页几乎都是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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值