今天嘗試了下爬蟲,爬取一本小說,忘語的凡人修仙仙界篇,當然這樣不好,大家要支持正版。
爬取過程中是老套路,先獲取網頁源代碼
# -*- 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”。