今天嘗試了下爬蟲,爬取一本小說,忘語的凡人修仙仙界篇,固然這樣很差,你們要支持正版。html
爬取過程當中是老套路,先獲取網頁源代碼 python
# -*- 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才行。url
gbk是是國家編碼,通用性比UTF8差,GB2312之類的都算是gbk編碼。spa
GBK包含所有中文字符;UTF-8則包含全世界全部國家須要用到的字符。3d
unicode是一種二進制編碼,全部utf-8和gbk編碼都得經過unicode編碼進行轉譯,即utf-8和gbk編碼之間不能直接轉換。附圖以下:code
python中編碼轉換用到了兩個函數decode()和encode()
好比:html=page_req.text.encode('iso-8859-1').decode('utf-8')
encode('iso-8859-1') 是將gbk編碼編碼成unicode編碼
decode(‘gbk’) 是從unicode編碼解碼成gbk字符串orm
因爲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是對GB2312的進一步擴展(K是漢語拼音kuo zhan(擴展)中「擴」字的聲母),
收錄了21886個漢字和符號,徹底兼容GB2312。
GB18030收錄了70244個漢字和字符,更加全面,與 GB 2312-1980 和 GBK 兼容。
GB18030支持少數民族的漢字,也包含了繁體漢字和日韓漢字。
其編碼是單、雙、四字節變長編碼的。
當國人獲得計算機後,那就要對漢字進行編碼。在ASCII碼錶的基礎上,小於127的字符意義與原來相同;而將兩個大於127的字節連在一塊兒,來表示漢字,前一個字節從0xA1(161)到0xF7(247)共87個字節,稱爲高字節,後一個字節從0xA1(161)到0xFE(254)共94個字節,稱爲低字節,二者可組合出約8000種組合,用來表示6763個簡體漢字、數學符號、羅馬字母、日文字等。
在從新編碼的數字、標點、字母是兩字節長的編碼,這些稱爲「全角」字符;而原來在ASCII碼錶的127如下的稱爲「半角」字符。
簡單而言,GB2312就是在ASCII基礎上的簡體漢字擴展。
UTF是在互聯網上使用最廣的一種Unicode的實現方式。咱們最經常使用的是UTF-8,表示每次8個位傳輸數據,除此以外還有UTF-16。
UTF-8長這樣,「你好中國!hello,123」:
你好中国!hello,123
準確來講,Unicode不是編碼格式,而是字符集。這個字符集包含了世界上目前全部的符號。
另外,在原來有些字符能夠用一個字節即8位來表示的,在Unicode將全部字符的長度所有統一爲16位,所以字符是定長的。
Unicode是長這樣的:
\u4f60\u597d\u4e2d\u56fd\uff01\u0068\u0065\u006c\u006c\u006f\uff0c\u0031\u0032\u0033
上面這段Unicode的意思是「你好中國!hello,123」。