• 关于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)
  • 相关阅读:
    输出宽字符数组 C++
    python并发编程之多线程2------------死锁与递归锁,信号量等
    python并发编程之多线程1
    初始线程(相关理论)
    python并发编程之多进程2-------------数据共享及进程池和回调函数
    python并发编程之多进程1-----------互斥锁与进程间的通信
    Cpython支持的进程与线程
    进程理论基础
    函数嵌套复习
    python中if __name__ == '__main__'的说明
  • 原文地址:https://www.cnblogs.com/catmelo/p/2085263.html
Copyright © 2020-2023  润新知