UnicodeEncodeError:的解决方法

今天在学习《集体智慧编程》这本书中第四章的搜索与排名时,自己动手尝试将书中Python2编写的实例程序改写成Python3的版本,编写好第一个爬虫程序,代码如下:

    #从一个小网页开始进行广度优先搜索,直至某一给定深度
    #期间为网页建立索引
    def crawl(self,pages,depth=2):
        print('searching %s'% pages)

        for i in range(depth):
            newpages=set()
            for page in pages:
                try:
                    c=urllib.request.urlopen(page)
                except:
                    <span style="color:#ff0000;">print("Could not open %s "%page)</span>
                    continue

                try:
                    soup=BeautifulSoup(c.read(),'html.parser')
                    self.addtoindex(page,soup)

                    links=soup.find_all('a')
                    for link in links:
                        if('href' in link.attrs):
                            url=urljoin(page,link['href'])
                            if url.find("'")!=-1:
                                continue
                            url=url.split('#')[0]  #去掉位置部分
                            if url[0:4]=='http' and not self.isindexed(url):
                                newpages.add(url)
                                print('the link is %s'%url)
                            linkText=self.gettextonly(link)
                            self.addlinkref(page,url,linkText)
                    self.dbcommit()
                except:
                    print("Could not parse %s "% page)
            pages=newpages



运行该程序,访问英文网站时速度虽然慢,但没有出错,但是在访问中文网站,如百度,网易等网址时,总是会出现下图所示的错误:




上述的消息提示编码有错误,尝试了将page字符串进行unicode编码,还是不行,后来经过多方搜索,终于在网上找到了问题的答案:http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/

原来对于Unicode字符,在Python中如果需要Print出来的话,由于本地系统是Win7的cmd,默认的是GBK编码,所以需要先将Unicode字符编码为GBK,然后在Cmd中显示出来,然而由于Unicode字符串中包含一些GBK中无法显示的字符,导致此时提示“gbk“ codec can't encode的错误的。

解决方式有二:

一:在Print的时候,将unicode字符串进行GBK编码,在编码是添加‘ignore’参数,忽略无法编码的字符,这样就可以正常编码为GBK了。代码如下:

<pre name="code" class="python"><span style="white-space:pre">		</span>try:
                    c=urllib.request.urlopen(page)
                except:
                    print("Could not open %s "%page.encode('GBK','ignore'))
                    continue


 

二:将Unicode字符串转换为GBK编码的超集GB18030,(即,GBK是GB18030的子集),代码如下:

<span style="white-space:pre">		</span>try:
                    c=urllib.request.urlopen(page)
                except:
                    print("Could not open %s "%page.encode('GB18030'))
                    continue

这样,再运行该爬虫程序的时候,就不会产生错误了。












  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值