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编码问题的最终分析的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

  3. Python之路3【知识点】白话Python编码和文件操作

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  4. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

  5. 【转】python编码的问题

    摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...

  6. 【转】python编码规范

    http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...

  7. python 编码 UnicodeDecodeError

    将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...

  8. Python编码/文件读取/多线程

    Python编码/文件读取/多线程 个人笔记~~记录才有成长   编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...

  9. 关于Python编码,超诡异的,我也是醉了

    Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图.   我早些时候的其他脚本,csv都是 ...

随机推荐

  1. View 以Diaglog 方式展示

    OutAdmissionBookingEditor admissionBookingEditor = this.LayoutManager.OpenDialog<OutAdmissionBook ...

  2. 超棒的 15 款 Bootstrap UI 编辑器

    自从 2011 年 Mark Otto 和 Jacob Thornton 开发了  Bootstrap,我们第一次接触并熟知了 Bootstrap .这些都归功于  Twitter!从那以后,它就非常 ...

  3. sonar的安装与代码质量检测实例

    说明:sonar依赖数据库. mysql优化 1.笔者使用的是mysql数据库.首先对mysql做简单的优化配置. [root@localhost bin]# cat /etc/my.cnf [mys ...

  4. JavaScriptSerializer 中的匿名类型 转json

    二:JavaScriptSerializer 中的匿名类型 这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化 ...

  5. HBase - Phoenix剖析

    1.概述 在<Hadoop-Drill深度剖析>一文当中,给大家介绍了Drill的相关内容,就实时查询来说,Drill基本能够满足要求,同时还可以做一个简单业务上的聚合,如果在使用Hive ...

  6. 查看JAVA进程中哪个线程CPU消耗最高

    一,在centos linux 上查看进程占用cpu过高 top  shift+h 查看哪个进程程消耗最高     二,查看JAVA进程中哪个线程消耗最高   2.1 导出java运行的线程信息   ...

  7. MARIADB 在 OPENSUSE 的安装。

    1.MARIADB  在 OPENSUSE  的安装或者升级  (参考 Setting up MariaDB Repositories ) OPENSUSE 从 12.3 版本开始,默认带有 MARI ...

  8. 在Android下运行Linux平台编译的程序

    编译时需注意使用 -static 编译选项: 否则会提示运行:/system/bin/sh: ./i2c: No such file or directory

  9. 如何将 Microsoft Bot Framework 链接至微信公共号

    说到 Microsoft Bot Framework 其实微软发布了已经有一段时间了,有很多朋友可能还不太了解,微软Bot的功能今天我给大家简单的介绍一下,Bot Framework的开发基础以及如何 ...

  10. POJ 2853 Sequence Sum Possibilities

    Sequence Sum Possibilities Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5537   Accep ...