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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
python删除不需要的python文件方法
Apr 24 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
Python3模拟登录操作实例分析
Mar 12 Python
python操作kafka实践的示例代码
Jun 19 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
python redis 批量设置过期key过程解析
Nov 26 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
python - timeit 时间模块
Apr 06 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
浅谈php的优缺点
2015/07/14 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
动态创建类实例代码
2009/10/07 Python
python黑魔法之编码转换
2016/01/25 Python
python实现移位加密和解密
2019/03/22 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
什么是Python包的循环导入
2020/09/08 Python
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
交通安全教育制度
2014/02/02 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
求职信结尾怎么写
2014/05/26 职场文书
商场租赁意向书
2014/07/30 职场文书
工人先进事迹材料
2014/12/26 职场文书
继承权公证书范本
2015/01/23 职场文书
道歉情书大全
2015/05/12 职场文书
高效课堂教学反思
2016/02/24 职场文书
python如何进行基准测试
2021/04/26 Python
Python中time与datetime模块使用方法详解
2022/03/31 Python