教女朋友学Python(6)——挖了坑是要填的

我本来不会Python,一边学一边试图以最简单方式来解释编程和Python,让各位理工男可以拿去教自己的女朋友。

上期我们写了让数据到碗里来的代码,然而并没有运行,所有没有进行测试运行的代码,都是坑,天大的坑,现在,我们来填坑。我为什么没运行呢?因为我知道会出错!什么错?请看:

错误信息:UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)。ascii码不能对位于21-22的字符进行编码,为什么呢,他的编码不在128的范围类。

问题:ASCII码是什么?

我们第一期说过,在计算机里面,是用数字0和1来表示信息的。用0和1表示数字的方式,叫二进制。可是怎么表示文字呢?简单,把文字转换成数字就可以了。转换嘛,其实制定一套编码指定哪个数字代表哪个字符。一帮人纠结来纠结去,后来选择了0—127,代表了26个小写字母、26个大写字母、10个数字、32个符号、33个句柄和一个空格总共128个字符,这就是ASCII码。现在知道错误信息里的128怎么来的了吧。

因为是美国人发明的,所以并没有考虑中文,甚至他们的老兄弟英国的英镑符号都没有考虑进去。所以,我们的中文字符“胡歌”,要用ascii去解码的时候,就会出错了。

怎么办呢?活人当然不会被尿憋死,既然别人老美可以有自己的编码,我们就不能也设定一个么。于是,中国的编码GB2312诞生。那么问题来了,有没有一套编码,包含各个国家的字符呢?当然有,Unicode!看Uni这个词根,就知道他要搞大事情。然而这套编码发明出来后大家并不太买账,为什么呢,因为他太庞大。想想ASCII码,只有1到127,最大的127用二进制表示是1111111,也就是说最少7位就能表示一个字符。想想Unicode要成万用码,那长度,真是我的天。为了克服Unicode的缺陷,又出来了UTF-8编码,这套编码与之前不同之处在于UTF8的编码是变长的。之前的比如ASCII码,表示1是用0000001,表示127是用1111111,都是7位,但是UTF-8不同,他表示小的数字用的位数就少,表示大的数字用的位数就大。于是设计者就将常用的字符对应比较小的数字,很少用的字符对应比较大的数字,也就是大部分情况下,他占的资源还是挺少的,这样就兼顾了通用和效率。

所以,只要将汉字“胡歌”表示成UTF-8就可以了。

有同学表示不服:我直接搜索胡歌都是可以的,而且浏览器上显示的也是汉字。为什么python就不可以,真是弱鸡啊。我说这位同学你这是图样图森破啊。看好了:

看实际上汉字变成了什么。那么这个%E8%83%A1%E6%AD%8C是什么呢?

是不是就是胡歌的UTF-8编码,只不过用了十六进制表示。

好了,那怎么改?用我刚刚输入的"胡歌".encode("utf-8")?那是不行的,一来,发现输出的b'\xe8\x83\xa1\xe6\xad\x8c'前面有个b没,这是什么?二来,输出结果出来是\x,而在网址中是百分号。

我先说解决方案,再解释上面说的这些。

解决方案:parse.quote("胡歌")。其中parse也是来自于上期说到的urllib模块,他出来的效果,就是%E8%83%A1%E6%AD%8C。

再来解释上面说到的几个问题。首先是\x,其实就是表示十六进制,没什么其他的意思。第二是百分号%,这是一个规定,在网址里面,遇到特殊符号就用%加符号的ASCII码的十六进制,遇到中文其实比较凌乱,有的是百分号加UTF-8编码,有的是加GB2312编码,这里我们暂时都用UTF-8,遇到坑了之后以后再说。

最后,稍复杂一些,这个b是什么鬼。我们说了,Python有五个基本数据类型。然而,我们经常下载文件,或者保存文件,是说多少B,多少KB,多少MB,多少GB,没听说过我们存了一个int,两个str,三个float。所以,在网络传输,磁盘存储的时候,都要将这些转成以字节bytes为单位的数据。1B=8bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示。要将字符串转换成字节,用encode();要将字节信息转换成字符串,用decode()。

如果不选编码,会默认使用Unicode。

好了,编码的问题讲完了,我们修改一下代码,再运行一下。

获取到数据了吧,而且看最后,我们获取到的数据是不是也是开头有个b的,从网络获取的数据都是这样,我们再把他解码一下,弄成字符串,方便以后处理:

htmlstr = data.decode("utf-8", "ignore")

ignore是为了防止一些莫名的解码错误,遇到了就忽视掉。

好了,现在我们拿到数据了,下一步,就要从这些数据中找出图片了。

欢迎关注我的微信公众号获取最新文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值