python抓取网页时字符集转换问题处理方案分享


Posted in Python onJune 19, 2014

问题提出:

    有时候我们采集网页,处理完毕后将字符串保存到文件或者写入数据库,这时候需要制定字符串的编码,如果采集网页的编码是gb2312,而我们的数据库是utf-8的,这样不做任何处理直接插入数据库可能会乱码(没测试过,不知道数据库会不会自动转码),我们需要手动将gb2312转换成utf-8。

首先我们知道,python里的字符默认是ascii码,英文当然没问题啦,碰到中文的时候立马给跪。

不知道你还记不记得,python里打印中文汉字的时候需要在字符串前面加 u:

print u"来搞基吗?"

这样子中文才能显示,这里面的u的作用就是将后面的字符串转换为unicode码,这样中文才能得到正确的显示。
这里与之相关的有一个unicode()函数,用法如下

str="来搞基"
str=unicode(str,"utf-8")
print str

与u的区别是,这里用unicode将str转换为unicode编码,需要正确指定第二个参数,这里的utf-8是我test.py脚本自身的文件字符集,默认的可能是ansi。
unicode这是一个关键,下面继续

我们开始抓取百度首页,注意,游客访问百度首页,查看网页源代码,它的charset=gb2312。

import urllib2
def main():
  f=urllib2.urlopen("http://www.baidu.com")
  str=f.read()
  str=unicode(str,"gb2312")
  fp=open("baidu.html","w")
  fp.write(str.encode("utf-8"))
  fp.close()

if __name__ == '__main__' :
  main()

解释:
我们首先用urllib2.urlopen()方法将百度首页抓取到,f是句柄 ,用str=f.read()将所有源代码读入str中

搞清楚,str里面就是我们抓取的html源代码,由于网页默认的字符集是gb2312,所以如果我们直接保存到文件中,文件编码将是ansi。

对于大部分人来说,其实这就足够了,但是有时候我就想把gb2312转换成utf-8的该怎么办呢?

首先:
    str=unicode(str,"gb2312") #这里的gb2312就是str的实际字符集,我们现在将其转换成unicode

然后:
    str=str.encode("utf-8") #将unicode的字符串重新编码成utf-8

最后:

    将str写入到文件中,打开文件看一下编码属性,发现是utf-8的了,把<meta charset="gb2312"改成<meta charset="utf-8" ,就是一个utf-8的网页了。做了这么多其实就完成了一个gb2312->utf-8的转码。

总结:

    我们回顾一下,如果需要将字符串按照指定的字符集保存,有以下几个步骤:

    1:用unicode(str,"原来的编码")将str解码成unicode字符串

    2:将unicode字符串str 使用 str.encode("指定的字符集") 转换成你指定的字符集

    3:将str保存文件,或者写入数据库等操作,当然,编码你已经指定了,不是吗?

Python 相关文章推荐
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
深入解析Python中的集合类型操作符
Aug 19 Python
实例Python处理XML文件的方法
Aug 31 Python
python 多线程实现检测服务器在线情况
Nov 25 Python
python安装教程
Feb 28 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
python selenium firefox使用详解
Feb 26 Python
django 单表操作实例详解
Jul 30 Python
django drf框架自带的路由及最简化的视图
Sep 10 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
python 实现的截屏工具
May 08 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
Oct 16 Python
python在linux中输出带颜色的文字的方法
Jun 19 #Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 #Python
win7 下搭建sublime的python开发环境的配置方法
Jun 18 #Python
Python写的贪吃蛇游戏例子
Jun 16 #Python
Python中的yield浅析
Jun 16 #Python
python中使用enumerate函数遍历元素实例
Jun 16 #Python
Python中字典(dict)和列表(list)的排序方法实例
Jun 16 #Python
You might like
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
读懂CommonJS的模块加载
2019/04/19 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
Python之re操作方法(详解)
2017/06/14 Python
python的中异常处理机制
2018/08/30 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python面向对象法实现图书管理系统
2019/04/19 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
企业指导教师评语
2014/04/28 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
学生通报表扬范文
2015/05/04 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
CSS极坐标的实例代码
2021/06/03 HTML / CSS