python爬蟲解決gbk亂碼問題


今天嘗試了下爬蟲,爬取一本小說,忘語的凡人修仙仙界篇,當然這樣不好,大家要支持正版。

  爬取過程中是老套路,先獲取網頁源代碼  

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests

if __name__ =='__main__':
    url='http://www.biquge.com.tw/18_18998/8750558.html'
    page_req=requests.get(url)
    html=page_req.text
    bf=BeautifulSoup( html)
    texts = bf.find_all('div',id='content')
    print(texts[0].text.replace('\xa0'*8,'\n\n'))

  結果:亂碼

  在瀏覽器看下代碼,是gbk編碼,需要進行轉碼,這方面不清楚,查了下資料。
  PS:爬取的所有網頁無論何種編碼格式,都轉化為utf-8格式進行存儲,與源代碼編碼格式不同所以出現亂碼

 

  UTF-8通用性比較好,是用以解決國際上字符的一種多字節編碼,它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。

  UTF-8編碼的文字可以在各國各種支持UTF8字符集的瀏覽器上顯示,也就是必須兩者都是utf-8才行。


  gbk是是國家編碼,通用性比UTF8差,GB2312之類的都算是gbk編碼。

  GBK包含全部中文字符;UTF-8則包含全世界所有國家需要用到的字符。


  unicode是一種二進制編碼,所有utf-8和gbk編碼都得通過unicode編碼進行轉譯,即utf-8和gbk編碼之間不能直接轉換。附圖如下:

 

  python中編碼轉換用到了兩個函數decode()和encode()
  比如:html=page_req.text.encode('iso-8859-1').decode('utf-8')
  encode('iso-8859-1') 是將gbk編碼編碼成unicode編碼
  decode(‘gbk’) 是從unicode編碼解碼成gbk字符串

  由於pycharm只能顯示來自unicode的漢字,代碼修改如下:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests

if __name__ =='__main__':
    url='http://www.biquge.com.tw/18_18998/8750558.html'
    page_req=requests.get(url)
    html=page_req.text.encode('iso-8859-1')
    bf=BeautifulSoup( html)
    texts = bf.find_all('div',id='content')
    print(texts[0].text.replace('\xa0'*8,'\n\n'))

解決:

附:

GBK

簡單而言,GBK是對GB2312的進一步擴展(K是漢語拼音kuo zhan(擴展)中“擴”字的聲母),
收錄了21886個漢字和符號,完全兼容GB2312。

GB18030

GB18030收錄了70244個漢字和字符,更加全面,與 GB 2312-1980 和 GBK 兼容。
GB18030支持少數民族的漢字,也包含了繁體漢字和日韓漢字。
其編碼是單、雙、四字節變長編碼的。

GB2312

當國人得到計算機后,那就要對漢字進行編碼。在ASCII碼表的基礎上,小於127的字符意義與原來相同;而將兩個大於127的字節連在一起,來表示漢字,前一個字節從0xA1(161)到0xF7(247)共87個字節,稱為高字節,后一個字節從0xA1(161)到0xFE(254)共94個字節,稱為低字節,兩者可組合出約8000種組合,用來表示6763個簡體漢字、數學符號、羅馬字母、日文字等。
在重新編碼的數字、標點、字母是兩字節長的編碼,這些稱為“全角”字符;而原來在ASCII碼表的127以下的稱為“半角”字符。
簡單而言,GB2312就是在ASCII基礎上的簡體漢字擴展。

UTF(UCS Transfer Format)

UTF是在互聯網上使用最廣的一種Unicode的實現方式。我們最常用的是UTF-8,表示每次8個位傳輸數據,除此之外還有UTF-16。
UTF-8長這樣,“你好中國!hello,123”:

你好中国!hello,123

Unicode

准確來說,Unicode不是編碼格式,而是字符集。這個字符集包含了世界上目前所有的符號。
另外,在原來有些字符可以用一個字節即8位來表示的,在Unicode將所有字符的長度全部統一為16位,因此字符是定長的。
Unicode是長這樣的:

\u4f60\u597d\u4e2d\u56fd\uff01\u0068\u0065\u006c\u006c\u006f\uff0c\u0031\u0032\u0033
  • 1

上面這段Unicode的意思是“你好中國!hello,123”。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM