关于BeautifulSoup编码的一些问题
昨天想初次接触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)
作者:catmelo
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。