python编码问题之\"encode\"&\"decode\"

python

encode

decode

编码

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。

当我们想获取网页源代码,并且希望能够以html后缀或者其他格式保存文件的时候,如果不进行编码,那么保存得到的文件在遇到中文时就会出现异常,不便于我们对数据的处理。

  • requests

首先说一下使用requests请求得到源代码的处理办法。 经过我无数次的实践,发现通过get请求得到的源代码都是“byte”类型,所以每当想都过write写入到文件中时总是会报错。如下:

#coding=utf-8 
import requests 
 
r = requests.get('http://www.baidu.com') 
 
print(type(r.text)) 
with open('baidu.html','w') as f: 
    f.write(r.text) 

输出结果

>>> 
<class 'str'> 
Traceback (most recent call last): 
  File "C:\Users\14356_000\Desktop\test.py", line 8, in <module> 
    f.write(r.text) 
UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 25364: illegal multibyte sequence 

解决办法:示例代码如下

 
import requests 
import chardet 
 
r = requests.get('http://www.baidu.com') 
content = r.text 
print(type(content)) 
print(chardet.detect(content.encode('utf-8'))) 
with open('baidu.html','w',encoding='utf-8') as f: 
    f.write(content.encode('utf-8').decode('utf-8')) 

注意chardet是用来查看文字编码类型的,之前想使用下面代码直接查看content的编码类型,但是报错。

... 
... 
print(chardet.detect(content)) 
 
>>> 
Traceback (most recent call last): 
  File "C:\Users\14356_000\Desktop\test.py", line 8, in <module> 
    print(chardet.detect(content)) 
  File "C:\Python35\lib\site-packages\chardet\__init__.py", line 25, in detect 
 raise ValueError('Expected a bytes object, not a unicode object') 
ValueError: Expected a bytes object, not a unicode object 

因此需要先通过encode,将content的编码格式转化为utf-8才能查看。。这里还没弄清楚为什么Expected a bytes object, not a unicode object,先放着。 下面说说写入操作。写入操作之前需要制定encoding的方式为utf-8,另外f.write()时还得先把content的编码格式设置成utf-8,然后再通过decode解码,将utf-8格式解码成Unicode格式,即python内置的编码格式,这样就能正常写入了,而且中文正常显示!!! 下面是最上面代码的输出结果。

>>> 
<class 'str'> 
{'encoding': 'utf-8', 'confidence': 0.99} 
[Finished in 2.3s] 
 urllib
 

先写到这~~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coolblog.xyz技术专栏

Dubbo 源码分析 - 集群容错之 Router

上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇...

11810
来自专栏老九学堂

原来C语言和其他高级语言的最大的区别是这个...

我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。

17430
来自专栏JAVA技术站

JFinal一行代码搞定增删改,要的就是快 原

首先需要重写getModel方法,但是这有个问题,重写之后的方法和getModel的参数有点冲突,所以选择不重写,另外写个方法占且叫getBaseModel吧,...

7810
来自专栏视觉求索无尽也

【Python】Python知识点总结

字典{key:value,key:value},dict(key=value,key=value):

53810
来自专栏精讲JAVA

OutOfMemoryError异常系列之方法区溢出和运行时常量溢出池溢出

按照虚拟机的内存分配,运行时常量池属于方法区,所以今天在这一起讲了,大家都知道1.7的虚拟机规范出来以后,有个很重要的一点就是去永久代。今天我们...

260100
来自专栏奔跑的蛙牛技术博客

什么是字节码?

字节码(Byte-code)是一种包含执行程序,由一序列 op 代码/数据对组成的二进制文件,是一种中间码。字节是电脑里的数据量单位。

55930
来自专栏用户2442861的专栏

Java多线程学习(吐血超详细总结)

http://blog.csdn.net/evankaka/article/details/44153709

5.7K20
来自专栏mathor

第六届蓝桥杯决赛B组C/C++——密文搜索

18320
来自专栏大闲人柴毛毛

深入JVM——OOM异常解析

JVM对象访问解析 对象访问过程的内存情况 public void function(){ Object obj = new Object(); } f...

457110
来自专栏程序员的SOD蜜

实例探究字符编码:unicode,utf-8,default,gb2312 的区别

 最近做邮件收发,不同的邮件系统间可能会出现编码问题,迫使我重新回来研究一下字符的编码问题,unicode,utf-8,gb2312这些编码格式都是我们熟知的,...

264100

扫码关注云+社区

领取腾讯云代金券