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.mzph.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…