【爬虫】获取网页编码、chardet库、Python的字符编码

目录

1、常用网页编码有

2、怎么知道一个网页的编码?

我们知道可以从审查元素(F12)通过查看元素获得。

 那么有没有一种方法可以通过代码获取到编码呢?

3、chardet库

1、安装

2、chardet.detect()函数

3、乱码问题

我们可以通过审查元素查询网址是使用的哪种编码方式以便指定编码方式

或者利用chardet库来解决:

4、Python的字符编码

A、在Python 3中,字符串的编码使用str和bytes两种类型。

B、encode()和decode()

示例:

C、非法字符抛出异常

   1、decode()第二个参数

   2、encode()第二个参数也一样


 

 

1、常用网页编码有

  • GBK
  • GB2312
  • UTF-8

2、怎么知道一个网页的编码?

我们知道可以从审查元素(F12)通过查看元素获得。

比如

eae2db82fac94fec8ff5a224b8a104ff.png

 那么有没有一种方法可以通过代码获取到编码呢?

代码如下:

import requests
import chardet

url = str(input('输入要获取编码的网站'))
req = requests.get(url)
html = req.content
chardet = chardet.detect(html)
print(chardet)

输入网址 我们可以得到以下输出

17cdaf6d4e9744e79df3ae7090704bc2.png

 

3、chardet库

上述代码用到了这个库

下面简单介绍一下这个库

 

1、安装

命令窗口输出一下命令

pip install chardet

检查是否成功有两种方法

可以在(cmd)输入:pip list 查找是否有chardet

947a6750ece8458f84cd65e719425e19.png

也可以通过 看它是否报错来确认

 

141f8bb33c1f432a8cf27b98a8f5b350.png

 

2、chardet.detect()函数

上面代码用了这个函数

detect()它返回一个字典,其中包含自动检测到的字符编码和从0到1的可信度级别。

  • encoding:表示字符编码方式。
  • confidence:表示可信度。
  • language:语言。

我们进入百度网址用审查元素看编码方式为utf-8

ea6c188336084de7a9df584808974156.png

 

或者用第二点的代码可以知道:

df75d2665b7744beb047bc188e61db7c.png

 3、乱码问题

假如我们执行下列代码:将编码改成 ”GB2312”

import requests

header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50 '
}

req = requests.get('https://www.baidu.com/', headers=header)
req.encoding = 'GB2312'

print(req.text)

输出如下:

4a1d3208452b419e93e583b52b94f968.png

可以看到出现了乱码:说明没有按照正确编码方式编码

我们可以通过审查元素查询网址是使用的哪种编码方式以便指定编码方式

比如:

req = requests.get('https://www.baidu.com/', headers=header).content.decode('utf-8')

print(req)

c59f0bf25e70465d97e62aac228bd67b.png

 可以看到没有乱码了


或者利用chardet库来解决:

# -*- coding: utf-8 -*-
"""
@File  : 00.py
@author: FxDr
@Time  : 2022/11/01 23:48
"""
import requests
import chardet

header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.50 '
}
req = requests.get('https://www.baidu.com/', headers=header)
req.encoding = chardet.detect(req.content)['encoding']
print(req.text)

像这样:我们设置编码 

req.encoding = chardet.detect(req.content)['encoding']

f47d5e13aa9b475396e286f0708b73c8.png

可以看到乱码问题解决 

 

4、Python的字符编码

 

A、在Python 3中,字符串的编码使用str和bytes两种类型。

(1)str字符串:使用Unicode编码。
(2)bytes字符串:使用将Unicode转化成的某种类型的编码,如UTF-8、GBK。

Python 3的字符串默认编码为str,使用Unicode编码。

B、encode()和decode()

前者的作用是将Unicode编码转换成其他编码的字符串,

而decode的作用是将其他编码的字符串转换成Unicode编码。

示例:

import chardet
s = "你好"
print(s,type(s)) # 你好 <class 'str'>
s_gbk = s.encode('GBK')
print(s_gbk,type(s_gbk)) # b'\xc4\xe3\xba\xc3' <class 'bytes'>
print(chardet.detect(s_gbk)['encoding']) # TIS-620

fd4fc2c8d283494f8d6728cc6b9ce91d.png

 注意:unicode不可以decode()

已经被编码的UTF-8也不可以再encode()

因为在Python 3中,unicode不可以再被解码

>>假如想把UTF-8转成其他非unicode编码,

必须要先decode成unicode,再encode为其他非unicode编码,如GBK

C、非法字符抛出异常

有时候我们用了一种编码方式,比如爬小说大部分都可以正确解码,但是突然报个错,

说“非法字符”,可能是因为网站用的编码太杂了 

所以我们可以让 errors='ignore' 忽悠非法字符

1、decode()第二个参数

为控制错误处理的方式,默认为strict,遇到非法字符时会抛出异常。

>>我们可以把第二个参数设置为其他变量,有以下3种方法:

>>(1)ignore,忽略其中的非法字符,仅显示有效字符。

>>(2)replace,使用符号代替非法字符,如'?'或'\ufffd'。

>>(3)xmlcharrefreplace,使用XML字符引用代替非法字符。

例如下列代码,假设字符串s中有多种编码产生的非法字符

s = "我无语啦"
s1 = s.encode('gbk') 
s_deco = s1.decode(encoding='utf-8', errors='replace')
print(s_deco)

3728f8331c6c494f8138fc0c67749b67.png

UnicodeDecodeError:非法的多字节序列

把decode()第二个参数 errors改为 ‘replace'可以看到不报错了

1a577f0dd12e485688290b280eff214e.png

 

 

2、encode()第二个参数也一样

"""
@File  : 01.py
@author: FxDr
@Time  : 2022/11/02 0:31
"""
s = "我无语了\u2020a"
s1 = s.encode(encoding='gbk').decode('gbk')
print(s1)

54373e7770a84f8f89e9b5a3c6c722a8.png

 加上参数errors='ignore'

 ffb62c8a4bf448dc8448511fa2d0fd54.png

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值