Python 爬虫解决 GBK乱码问题

打印 上一主题 下一主题

主题 1777|帖子 1777|积分 5331


前言

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

爬取的过程我采用了常见的套路,先获取网页源代码,以下是我最初的代码:
  1. # -*- coding:UTF-8 -*-
  2. from bs4 import BeautifulSoup
  3. import requests
  4. if __name__ == '__main__':
  5.     url='https://www.biquge186.com/shu/4192/89510154.html'
  6.     page_req=requests.get(url)
  7.     html=page_req.text
  8.     bf=BeautifulSoup( html)
  9.     texts = bf.find_all('div',id='content')
  10.     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的汉字,我对代码举行了修改:
  1. # -*- coding:UTF-8 -*-
  2. from bs4 import BeautifulSoup
  3. import requests
  4. if __name__ == '__main__':
  5.     url='http://www.biquge.com.tw/18_18998/8750558.html'
  6.     page_req=requests.get(url)
  7.     html=page_req.text.encode('iso - 8859 - 1')
  8.     bf=BeautifulSoup( html)
  9.     texts = bf.find_all('div',id='content')
  10.     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编码网页爬取时的乱码问题,这里留笔记记载一下。
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表