1. 程式人生 > >Python中的爬蟲輸出編碼問題

Python中的爬蟲輸出編碼問題

今天我跟隨網路上的視訊學習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寫爬蟲程式的朋友們提供一些幫助