python编码问题的最终分析
python初学者,往往因为字符编码的问题而苦恼不已,本人也是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果。下面一段代码是在python3.5上的,以它为例进行讲解(请忽略糟糕的变量名)。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import re
import urllib.request
def get_html(url):
download_page = urllib.request.urlopen(url).read().decode('GBK')
return download_page
def get_image(html):
img_list = re.findall(r'src="(.+?\.jpg)"', html)
x = 1
for img_url in img_list:
print("正在下载" + str(x) + "")
urllib.request.urlretrieve("https:" + img_url.lstrip(), 'd:\\list\\%s.jpg' % x)
x += 1
html_page = get_html("https://mm.taobao.com/self/aiShow.htm?spm=719.7763510.1998643336.43.xMxXj5&userId=722569871")
get_image(html_page)
这是一个很简单的网络图片爬虫,代码本身并没有什么特色和难点。我们主要关注的是编码问题。由于是python3.5的环境,代码第二行可以没有。
网上多数文章都没有清晰的指出一个问题:编码问题分“代码的编码”和“网页或文件的编码”。什么意思?就是在写代码时要同时考虑代码本身的编码和你的代码要处理的网页或文件对象的编码!这是两个方面,不能混淆!
1、先来说说代码的编码:
代码的编码指的是你用vim、notepad、UE、IDE等等文本编辑工具或集成环境,通过键盘输入字符,并保存成文件储存在硬盘的东西。在以往python2.x版本的时候,默认使用ASCII码,它使用一个字节也就是8位空间,只存储127个英文系字母/字符,通俗的讲,它只支持英语,不支持中文。因此,如果在代码里输入中文,编译会报错,我们往往采取在代码文件第二行顶头进行编码声明的方式来解决这个问题,也就是#coding:utf-8。通过这一行,就指定了代码文件里的所有字符都使用utf-8的编码格式进行存储,而在utf-8里是支持中文的,也就是说,你可以直接这样:name=‘jack’ 和 name2= '张三'。而在python3.x版本中,unicode编码成为了默认编码,unicode也是一个同时支持英文和中文的编码格式,因此你连第二行的编码申明都可以不用了,直接使用中文就好了。
但是,#coding:utf-8解决不了你在处理网页和数据文件中的编码问题,它只针对代码本身!
2、再说说网页或文件对象的编码:
在python代码中,处理网页和文件系统上的数据文件,是再正常不过的事了,比如各种爬虫,比如文件读取。上面我们解决了代码自己的编码,但是并没有解决处理对象的编码!什么意思?以文章开头的代码为例,它用来爬取一个网页的图片,而这个网页是用GBK编码的(这是一种中文编码方式)。可以通过查看页面源代码得知。

页面被读取后,以GBK编码格式暂存在内存。但是,内存里处理字符都是用unicode编码格式的!这就存在了问题。

上面的错误信息就是因为编码冲突造成的。我们需要解码!
解码的方法是decode('编码格式'),它可以将别的编码格式转换成unicode。例如decode('GBK')、decode('utf-8')。解码后爬取下来的网页就以unicode编码格式存储在内存里,然后可以被正常的进行正则分析,匹配,查找,而不会报错。
同样我们也可以进行编码encode(),它可以将unicode编码格式转换成别的编码格式,一般都是utf-8。
总结:其实编码问题没有想象中那么复杂,大家只要分清楚这里的两部分,就很容易搞定。可以利用上面的代码,注释掉
decode('GBK')这部分做个试验。有不正确的地方,请大家指正!
python编码问题的最终分析的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
- 【转】python编码的问题
摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- python 编码 UnicodeDecodeError
将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...
- Python编码/文件读取/多线程
Python编码/文件读取/多线程 个人笔记~~记录才有成长 编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
随机推荐
- Python多线程编程之多线程加锁
Python语言本身是支持多线程的,不像PHP语言. 下面的例子是多个线程做同一批任务,任务总是有task_num个,每次线程做一个任务(print),做完后继续取任务,直到所有任务完成为止. #co ...
- JavaScript中的CSS属性对照表
盒子标签和属性对照 CSS语法(不区分大小写) JavaScript语法(区分大小写) border border border-bottom borderBottom border-bottom-c ...
- 努力学习 HTML5 (1)—— 初体验
HTML5 代表未来:W3C ( World Wide Web Consortium, 万维网联盟) 已经放弃 XHTML,从而使 HTML5 成为正式标准并得到认可. 最简单的 HTML5 文档 & ...
- 那些在学习iOS开发前就应该知道的事(part 1)
英文原文:Things I wish I had known before starting iOS development—Part 1 http://www.cocoachina.com/ios/ ...
- VB中WinSock控件的属性、方法、事件及应用
一.WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的 ...
- Android 设置VPN(pptp连接方式)
本教程以小米手机的MIUI系统为例子,教大家如何设置VPN 先找到“设置”,打开设置菜单,如下图: 在设置菜单里面找“其它连接方式” 然后找到“VPN”,点击进入: 进入VPN设置界面后,如果VPN未 ...
- Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...
- Make it run, make it right, make it fast
如果问我工作十多年后相比刚毕业参加的时候,学到了哪些重要的经验,那么"Make it work, make it right, make it fast"一定是其中最重要的经验之一 ...
- 在Oracle Linux Server release 6.4下配置ocfs2文件系统
① 安装ocfs-tools-1.8 如果是使用RedHat Enterprise Linux 6.4,也可以安装ocfs-tools-1.8的,只是要插入Oracle Linux Server re ...
- A simple visualization of energy function and energy gap in hopfield nets