Python 爬虫解决 GBK乱码问题

news2025/4/20 23:10:40

文章目录

  • 前言
    • 爬取初尝试与乱码问题
    • 编码知识科普
      • UTF - 8
      • GBK
      • Unicode
    • Python中的编码转换
    • 其他编码补充知识
      • GBK
      • GB18030
      • GB2312
      • UTF(UCS Transfer Format)
      • Unicode
    • 总结

在这里插入图片描述

前言

在Python爬虫的过程中,我尝试爬取一本小说,遇到GBK乱码问题,以下是我的解决办法。

爬取初尝试与乱码问题

爬取的过程我采用了常见的套路,先获取网页源代码,以下是我最初的代码:

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

if __name__ == '__main__':
    url='https://www.biquge186.com/shu/4192/89510154.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编码,而我爬取的内容需要进行转码处理。出现乱码的原因是爬取的所有网页无论何种编码格式,都转化为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 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位,因此字符是定长的。例如\u4f60\u597d\u4e2d\u56fd\uff01\u0068\u0065\u006c\u006c\u006f\uff0c\u0031\u0032\u0033 表示的就是“你好中国!hello,123”。

总结

通过这次爬取数据的经历,我对Python爬虫中的编码问题有了更深入的理解,也掌握了如何解决GBK编码网页爬取时的乱码问题,这里留笔记记录一下。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决echarts饼图label显示不全的问题

解决办法 添加如下配置: labelLayout: {hideOverlap: false},

JCST 2025年 区块链论文 录用汇总

Conference:Journal of Computer Science and Technology (JCST) CCF level:CCF B Categories:交叉/综合/新兴 Year:2025(截止4.19) JCST 2024年 区块链论文 录用汇总 1 Title: An Understandable Cro…

不带无线网卡的Linux开发板上网方法

I.MX6ULL通过网线上网 设置WLAN共享修改开发板的IP 在使用I.MX6ULL-MINI开发板学习Linux的时候,有时需要更新或者下载一些资源包,但是开发板本身是不带无线网卡或者WIFI芯片的,尝试使用网口连接笔记本,笔记本通过无线网卡连接WIFI…

选择排序(简单选择排序、堆排序)

简单选择排序(Selection Sort) 1. 算法思想 它通过多次遍历数组,每次从未排序部分中选择最小(或最大)的元素,将其放到已排序部分的末尾(或开头),直到整个数组有序。 2.…

velocity模板引擎

文章目录 学习链接一. velocity简介1. velocity简介2. 应用场景3. velocity 组成结构 二. 快速入门1. 需求分析2. 步骤分析3. 代码实现3.1 创建工程3.2 引入坐标3.3 编写模板3.4 输出结果示例1编写模板测试 示例2 4. 运行原理 三. 基础语法3.1 VTL介绍3.2 VTL注释3.2.1 语法3.2…

13.第二阶段x64游戏实战-分析人物等级和升级经验

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:12.第二阶段x64游戏实战-远程调试 效果图: 如下图红框,…

六边形棋盘格(Hexagonal Grids)的坐标

1. 二位坐标转六边形棋盘的方式 1-1这是“波动式”的 这种就是把【方格子坐标】“左右各错开半个格子”做到的 具体来说有如下几种情况 具体到庙算平台上,是很巧妙的用一个4位整数,前两位为x、后两位为y来进行表示 附上计算距离的代码 def get_hex_di…

SICAR 标准 安全门锁操作箱 按钮和指示灯说明

1、安全门锁操作箱 2、按钮和指示灯说明 一、指示灯说明 红灯: 常亮:表示安全门已解锁;闪烁:表示安全门未复位;熄灭:表示安全门已复位。 黄灯: 常亮:表示处于维修模式。 绿灯&…

Day10【基于encoder- decoder架构实现新闻文本摘要的提取】

实现新闻文本摘要的提取 1. 概述与背景2.参数配置3.数据准备4.数据加载5.主程序6.预测评估7.生成效果8.总结 1. 概述与背景 新闻摘要生成是自然语言处理(NLP)中的一个重要任务,其目标是自动从长篇的新闻文章中提取出简洁、准确的摘要。近年来…

【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼

文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型,可能不带骨骼信息,或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…

Linux——firewalld防火墙(笔记)

目录 一:Firewalld防火墙的概述 (1)firewalld简介 (2)firewalld&iptables的关系 (3)firewalld与iptables service的区别 1. ‌规则管理方式‌ 2. ‌默认策略与设计逻辑‌ 3. ‌配置文…

YOLO拓展-锚框(anchor box)详解

一.锚框(anchor box)概述 1.1什么是锚框 锚框就是一种进行预测的像素框,通过遍历输入图像上所有可能的像素框,然后选出正确的目标框,并对位置和大小进行调整就可以完成目标检测任务。 对于yolo锚框的建设须基于实际…

kubernetes》》k8s》》Service

Kubernetes 中的 Service 是用于暴露应用服务的核心抽象,为 Pod 提供稳定的访问入口、负载均衡和服务发现机制。Service在Kubernetes中代表了一组Pod的逻辑集合,通过创建一个Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址…

已注册商标如何防止被不使用撤销!

近年来已注册商标被撤销越来越多,不乏著名企业或机构,普推知产商标老杨看到前一阵看到央视和百度等申请的商标也被申请撤销,连续三年不使用撤销也是正常的商标流程。 已注册商标被撤销普推老杨看到案例主要是集中在一些早期申请注册的好记的商…

管理与维护samba服务器

允许 Linux、Unix 系统与 Windows 系统之间进行文件和打印机共享,使得不同操作系统的用户能够方便地访问和共享资源,就像在同一局域网中的 Windows 计算机之间共享资源一样。 server01安装Samba服务器 [rootserver ~]# rpm -qa | grep samba [rootserver…

EAGLE代码研读+模型复现

要对代码下手了,加油(ง •_•)ง 作者在他们自己的设备上展现了推理的评估结果,受第三方评估认证,EAGLE为目前最快的投机方法(虽然加速度是评估投机解码方法的主要指标,但其他点也值得关注。比如PLD和Lookahead无需额…

2024期刊综述论文 Knowledge Graphs and Semantic Web Tools in Cyber Threat Intelligence

发表在期刊Journal of Cybersecurity and Privacy上,专门讲知识图谱技术和语义Web工具在网络威胁情报领域的作用,还把本体和知识图谱放在相同的地位上讨论。 此处可以明确一点:本体和知识图谱都可以用于网络威胁情报的应用,当然也…

linux socket编程之udp(实现客户端和服务端消息的发送和接收)

目录 一.创建socket套接字(服务器端) 二.bind将prot与端口号进行绑定(服务器端) 2.1填充sockaddr_in结构 2.2bind绑定端口 三.直接通信(服务器端) 3.1接收客户端发送的消息 3.2给客户端发送消息 四.客户端通信 4.1创建socket套接字 4.2客户端bind问题 4.3直接通信即可…

计算机网络 实验四 静态路由的配置与应用

一、实验目的 掌握路由器基础工作原理及静态路由协议机制熟练使用华为ENSP网络模拟器进行拓扑设计与设备配置建立系统化的网络故障排除思维通过实践验证静态路由在中小型网络中的部署优势 二、实验环境 硬件配置:标准PC终端软件工具:华为企业网络模拟…

[每周一更]-(第140期):sync.Pool 使用详解:性能优化的利器

文章目录 一、什么是 sync.Pool?二、sync.Pool 的基本作用三、sync.Pool 的主要方法四、sync.Pool 的内部工作原理五、sync.Pool 适用场景六、使用示例示例 1:基本使用输出示例:示例 2:并发使用 七、一个基于 sync.Pool 的 **Benc…