zoukankan      html  css  js  c++  java
  • 关于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)
  • 相关阅读:
    P2420 让我们异或吧(倍增)
    bzoj题目分类
    hash练习们
    bzoj1433[ZJOI2009]假期的宿舍(匈牙利)
    bzoj2427:[HAOI2010]软件安装(Tarjan+tree_dp)
    bzoj2730矿场搭建(Tarjan割点)
    codevs4511信息传递(Tarjan求环)
    进入js
    css层叠样式表
    HTML超文本标记语言
  • 原文地址:https://www.cnblogs.com/catmelo/p/2085263.html
Copyright © 2011-2022 走看看