Python 爬蟲解決 GBK亂碼問題

文章目錄

  • 前言
    • 爬取初嘗試與亂碼問題
    • 編碼知識科普
      • UTF - 8
      • GBK
      • Unicode
    • Python中的編碼轉換
    • 其他編碼補充知識
      • GBK
      • GB18030
      • GB2312
      • UTF(UCS Transfer Format)
      • Unicode
    • 總結

在這里插入圖片描述

前言

在Python爬蟲的過程中,我嘗試爬取一本小說,遇到GBK亂碼問題,以下是我的解決辦法。

爬取初嘗試與亂碼問題

爬取的過程我采用了常見的套路,先獲取網頁源代碼,以下是我最初的代碼:

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requestsif __name__ == '__main__':url='https://www.biquge186.com/shu/4192/89510154.html'page_req=requests.get(url)html=page_req.textbf=BeautifulSoup( html)texts = bf.find_all('div',id='content')print(texts[0].text.replace('\xa0'*8,'\n\n'))

然而,運行代碼后,結果卻出現了亂碼。我在瀏覽器中查看網頁代碼,發現該網頁采用的是GBK編碼,而我爬取的內容需要進行轉碼處理。出現亂碼的原因是爬取的所有網頁無論何種編碼格式,都轉化為UTF - 8格式進行存儲,與源代碼編碼格式不同。

編碼知識科普

UTF - 8

UTF - 8通用性比較好,是用以解決國際上字符的一種多字節編碼。它對英文使用8位(即一個字節),中文使用24位(三個字節)來編碼。UTF - 8編碼的文字可以在各國各種支持UTF8字符集的瀏覽器上顯示,也就是說,網頁和瀏覽器的編碼都得是UTF - 8才行。

GBK

GBK是國家編碼,通用性比UTF - 8差,GB2312之類的都算是GBK編碼。GBK包含全部中文字符,而UTF - 8則包含全世界所有國家需要用到的字符。

Unicode

Unicode是一種二進制編碼,所有UTF - 8和GBK編碼都得通過Unicode編碼進行轉譯,即UTF - 8和GBK編碼之間不能直接轉換。
在這里插入圖片描述

Python中的編碼轉換

在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 requestsif __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位,因此字符是定長的。例如\u4f60\u597d\u4e2d\u56fd\uff01\u0068\u0065\u006c\u006c\u006f\uff0c\u0031\u0032\u0033 表示的就是“你好中國!hello,123”。

總結

通過這次爬取數據的經歷,我對Python爬蟲中的編碼問題有了更深入的理解,也掌握了如何解決GBK編碼網頁爬取時的亂碼問題,這里留筆記記錄一下。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77177.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

B站搜索關鍵詞機制深度解析:算法邏輯與優化策略

在擁有超過5億用戶的B站生態系統中,每天都有海量的視頻內容被上傳和消費。對于創作者而言,如何讓自己的視頻在茫茫內容海洋中被目標受眾發現,是至關重要的課題。而關鍵詞,正是連接內容與用戶的關鍵橋梁。理解B站的搜索關鍵詞機制&…

寶塔面板中解鎖Laravel日志查看的奧秘

目錄 一、前言二、Laravel 日志基礎認知2.1 日志的作用2.2 Laravel 日志的默認配置 三、查找 Laravel 日志文件位置3.1 常規存儲路徑3.2 自定義路徑查找 四、查看 Laravel 日志內容4.1 寶塔面板文件管理器查看4.2 使用命令行查看 五、常見問題及解決方法5.1 權限不足無法查看5.…

Matlab Add Legend To Graph-圖例添加到圖

Add Legeng To Graph: Matlab的legend()函數-圖例添加到圖 將圖例添加到圖 ,圖例是標記繪制在圖上的數據序列的有用方法。 下列示例說明如何創建圖例并進行一些常見修改,例如更改位置、設置字體大小以及添加標題。您還可以創建具有多列的圖…

K8S+Prometheus+Consul+alertWebhook實現全鏈路服務自動發現與監控、告警配置實戰

系列文章目錄 k8s服務注冊到consul prometheus監控標簽 文章目錄 系列文章目錄前言一、環境二、Prometheus部署1.下載2.部署3.驗證 三、kube-prometheus添加自定義監控項1.準備yaml文件2.創建新的secret并應用到prometheus3.將yaml文件應用到集群4.重啟prometheus-k8s pod5.訪…

基于YOLO11的車牌識別分析系統

【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】系統數據統計與可視化分析支持 【技術棧】 ①:系統環境:Windows/macOS/Linux ②:開發環境:Python 3.8 ③:技術棧&#x…

每天記錄一道Java面試題---day39

GC如何判斷對象可以被回收了 回答重點 引用計數法: - 每個對象由一個引用計數屬性,新增一個引用時計數器加1,引用釋放時計數減1,計數為0時可以回收。可達性分析法: - 從GC Roots開始向下搜索,搜索所走過的…

機器學習(5)——支持向量機

1. 支持向量機(SVM)是什么? 支持向量機(SVM,Support Vector Machine)是一種監督學習算法,廣泛應用于分類和回歸問題,尤其適用于高維數據的分類。其核心思想是尋找最優分類超平面&am…

從零到一:網站設計新手如何快速上手?

從零到一:網站設計新手如何快速上手? 在當今數字化時代,網站已成為企業、個人展示信息、提供服務的重要窗口。對于想要涉足網站設計領域的新手而言,如何快速上手并掌握必要的技能成為首要任務。本文將從基礎知識、軟件工具、設計…

藍橋杯2024國B數星星

小明正在一棵樹上數星星,這棵樹有 n 個結點 1,2,?,n。他定義樹上的一個子圖 G 是一顆星星,當且僅當 G 同時滿足: G 是一棵樹。G 中存在某個結點,其度數為 ∣VG?∣?1。其中 ∣VG?∣ 表示這個子圖含有的結點數。 兩顆星星不相…

Django從零搭建賣家中心登陸與注冊實戰

在電商系統開發中,賣家中心是一個重要的組成部分,而用戶注冊與登陸則是賣家中心的第一步。本文將詳細介紹如何使用Django框架從零開始搭建一個功能完善的賣家注冊頁面,包括前端界面設計和后端邏輯實現。 一、項目概述 我們將創建一個名為sel…

Opencv使用cuda實現圖像處理

main.py import os import cv2 print(fOpenCV: {cv2.__version__} for python installed and working) image cv2.imread(bus.jpg) if image is None:print("無法加載圖像1") print(cv2.cuda.getCudaEnabledDeviceCount()) cv2.cuda.setDevice(0) cv2.cuda.printCu…

如何編制實施項目管理章程

本文檔概述了一個項目管理系統的實施計劃,旨在通過統一的業務規范和技術架構,加強集團公司的業務管控,并規范業務管理。系統建設將遵循集團統一模板,確保各單位項目系統建設的標準化和一致性。 實施范圍涵蓋投資管理、立項管理、設計管理、進度管理等多個方面,支持項目全生…

B端可視化方案,如何助力企業精準決策,搶占市場先機

在當今競爭激烈的商業環境中,企業需要快速、準確地做出決策以搶占市場先機。B端可視化方案通過將復雜的企業數據轉化為直觀的圖表和儀表盤,幫助企業管理層和業務人員快速理解數據背后的業務邏輯,從而做出精準決策。本文將深入探討B端可視化方…

基于FPGA的一維時間序列idct變換verilog實現,包含testbench和matlab輔助驗證程序

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 DCT離散余弦變換 4.2 IDCT逆離散余弦變換 4.3 樹結構實現1024點IDCT的原理 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) matlab仿真結果 FPGA仿真結果 由于FP…

Android基礎教程 - 學習完成記錄

視頻學習教程 視頻鏈接:2022 最新 Android 基礎教程,從開發入門到項目實戰,看它就夠了,更新中_嗶哩嗶哩_bilibili 學習下來,有遇到很多問題,在 chatgpt、claude 和 Android Studio 插件通義千問的幫助下&…

Web開發-JavaEE應用原生和FastJson反序列化URLDNS鏈JDBC鏈Gadget手搓

知識點: 1、安全開發-JavaEE-原生序列化-URLDNS鏈分析 2、安全開發-JavaEE-FastJson-JdbcRowSetImpl鏈分析 利用鏈也叫"gadget chains",我們通常稱為gadget: 1、共同條件:實現Serializable或者Externalizable接口&…

OpenCV操作函數

1、cv2.imread() 2、 cv2.imshow() 3、 cv2.waitKey() 4、cv2.imwrite() 5、cv2.selectROI() 6、 cv2.VideoCapture() 7、cv2.cvtColor(&#xff…

AI編程新紀元:GitHub Copilot、CodeGeeX與VS2022的聯合開發實踐

引言:AI編程時代的到來 在軟件開發領域,我們正站在一個歷史性的轉折點上。GitHub Copilot、CodeGeeX等AI編程助手的出現,結合Visual Studio 2022的強大功能,正在重塑代碼編寫的本質。這不僅是工具層面的革新,更是開發范式的根本轉變。能夠有效利用這些AI工具的開發者將跨…

[特殊字符] MySQL MCP 開發實戰:打造智能數據庫操作助手

💡 簡介:本文詳細介紹如何利用MCP(Model-Control-Panel)框架開發MySQL數據庫操作工具,使AI助手能夠直接執行數據庫操作。 📚 目錄 引言MCP框架簡介項目架構設計開發環境搭建核心代碼實現錯誤處理策略運行和…

Dify部署過程中的錯誤和解決方案匯總

本文僅限于記錄Dify部署及使用過程中的BUG和解決方案 1. Dify配置SearXNG時報錯: 報錯內容: PluginInvokeError: {"args":{},"error_type":"ToolProviderCredentialValidationError","message":"Error 4…