Python中的爬虫输出编码问题

1 篇文章 0 订阅
1 篇文章 0 订阅

今天我跟随网络上的视频学习Python的爬虫编写,试着爬取百度百科,最后有一步需要输出爬取到的数据到文件中,以下是相应的代码:

def output_html(self):
        fileOut = open('output.html','w')
        fileOut.write("<html>")
        fileOut.write("<body>")
        fileOut.write("<table>")
        fileOut.write("<th>地址</th>")
        fileOut.write("<th>标题</th>")
        fileOut.write("<th>简介</th>")
        for data in self.datas:     #self.datas是存储爬取到的数据的变量
            fileOut.write("<tr>")
            fileOut.write("<td><a href=\'%s\'>%s</a></td>" % (data['url'], data['url']))
            fileOut.write("<td>%s</td>" % data['title'])
            fileOut.write("<td>%s</td>" % data['summary'].encode('utf-8'))
            fileOut.write("</tr>")

        fileOut.write("</table>")
        fileOut.write("</body>")
        fileOut.write("</html>")
        fileOut.close()

在实际测试爬取的时候,出现了问题:

Traceback (most recent call last):
File "E:/Program Test/python/spider/spider_main.py", line 36, in <module>
obj_spider.craw(root_url)
File "E:/Program Test/python/spider/spider_main.py", line 30, in craw
self.outputer.output_html()
File "E:\Program Test\python\spider\html_outputer.py", line 23, in output_html
fileOut.write("<td>%s</td>" % data['summary'])
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 440: illegal multibyte sequence

        一开始我以为是字符串编码的问题,然后就使用encode方法对最后输出的内容先进行编码再输出,虽然没有报错,但是最后当我打开html文件时,发现网页展示的内容变成了这样的情况:

这里写图片描述

然后我就去查询了关于encode和decode的方法介绍,发现encode是将unicode编码转化成其他的编码的方法(编码),而decode是将其他编码转化成unicode编码的方法(解码),而网上给出相应问题的解决方法则是先解码再重新编码,即:

data.decode('utf-8').encode('utf-8')

这样的方法,然而当我尝试时,发现我所使用的Python版本是3.5.1,在这个版本中str类型没有decode方法,也就是说无法用解码再编码的方法解决问题……

然后我就懵逼了……大家好像用的都是Python2的版本,网上也没有说Python3以上版本的解决方法……难不成我要去装Python2然后重新写?

正当我无聊的反复运行程序的时候,突然有一次程序没有报错,我马上就反应过来,检查了一下输出文件,发现输出也很正常,当我再一次运行程序时,报错又重新出现了,于是我开始仔细检查报错信息,发现有一句报错很奇怪:

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 440: illegal multibyte sequence  

这句报错中,position后的数字总是在发生变化,难道每次都是不同的地方出错?而且之前的’\xa0’应该是一个utf-8编码的字符,这个字符从来不会变,难道是这个字符导致了程序出错?于是我去查询了这个字符转义后的结果,发现\xa0其实就是html中的“空格”——&nbsp;

真相大白,原来在我爬虫程序运行时,每次爬取到的网页都是随机的,在相应网页中爬取到的内容中,有着空格存在,每次空格的位置不同,报错的position信息也就不同,而这空格无法被转化成utf-8编码的形式输出,所以才会报错。

知道了错误原因,自然也就可以解决了,只要在转化输出前,将字符串中的’\xa0’转化成真的空格就可以了:

fileOut.write("<td>%s</td>" % data['summary'].replace('\xa0',' '))

以上就是我第一次尝试写Python爬虫程序时遇到的编码问题和解决方法,希望能够给和我一样使用Python3写爬虫程序的朋友们提供一些帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值