zoukankan      html  css  js  c++  java
  • python爬虫解决gbk乱码问题

    今天尝试了下爬虫,爬取一本小说,忘语的凡人修仙仙界篇,当然这样不好,大家要支持正版。

      爬取过程中是老套路,先获取网页源代码  

    # -*- 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”。

     
  • 相关阅读:
    安卓热修复
    Activity四种启动模式
    11、网页制作Dreamweaver(补充:JS零碎知识点&&正则表达式)
    6、C#基础整理(for 语句经典习题--for循环嵌套、穷举)
    5、C#基础整理(for 语句经典习题--与 if 的嵌套)
    4、C#基础整理(if语句经典习题)
    3、C#基础整理(语句概述)
    2、C#基础整理(运算符、数据类型与转换、var关键字)
    1、C#基础整理(进制转换的方法)
    10、网页制作Dreamweaver(扩展:各浏览器对 onunload 事件的支持与触发条件实现有差异)
  • 原文地址:https://www.cnblogs.com/ccsx/p/8572735.html
Copyright © 2011-2022 走看看