您的位置:首页 > 其它

关于BeautifulSoup编码的一些问题

2013-02-21 13:29 211 查看
昨天想初次接触BeautifulSoup,想通过写一个简易在线词典小工具边学边练。

为了深入了解一下BeautifulSoup,没有采用直接调用在线词典api,而是通过分析百度结果页html得到代码段。

中间调试数次,总是在第一次搜索成功之后出现假死。代码如下:#!/usr/bin/python

反复不得其解,最终通过CPyUG得到了Rujia Liu帮助:

Rujia写道

我试了下,有些网页的字符编码没有被beautifulSoup检测出来,比如搜索"list"的时候,结果中有的字符不在gb2312里,但是网页meta里写的确实gb2312。我的解决方法是自行encode且忽略错误,像这样:
wordweb=unicode(wordweb,'gb18030','ignore') # 因为用了ignore, 这里也可以编码成gb2312
soup=BeautifulSoup(wordweb)
目前我试了不少单词,都可以搜。
btw: 最好别用"译典通"作为定位依据吧,根据id找div比较靠谱。有几个id特殊的div,比如dict, en,
enc。另外,捕捉一下异常,处理单词不存在的情况。
- Rujia

Rujia 写道

当charset有问题的时候,BeautifulSoup不会忽略掉无法解码的字符。我以前就是你搜到的这么写的,但是偶尔会遇到问题(我写的搜索引擎,处理的网页比较千奇百怪),所以才用的我前面提到的解决办法。

通过google了解到,BeautifulSoup遇到编码混乱的网页可以采用如下普遍做法:

def search(self):
word=self.edit.text()
wordweb=urllib2.urlopen("http://dict.baidu.com/s?wd=%s"% word)
charset = wordweb.headers['Content-Type'].split(' charset=')[0].lower()
soup=BeautifulSoup(wordweb,fromEncoding=charset)
exp=soup.findAll(text=re.compile(u'译典通'))[0].parent.parent.parent.parent
exp=str(exp).decode('utf8')
self.label.setText(exp)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: