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实现异步回调机制代码分享
Jan 10 Python
浅谈Python中的私有变量
Feb 28 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
使用python实现简单五子棋游戏
Jun 18 Python
wxPython多个窗口的基本结构
Nov 19 Python
python opencv如何实现图片绘制
Jan 19 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
Python random库使用方法及异常处理方案
Mar 02 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
Python调用C语言程序方法解析
Jul 07 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
Python标准库pathlib操作目录和文件
Nov 20 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上传中文文件名乱码问题处理方案
2015/02/03 PHP
JavaScript实际应用:innerHTMl和确认提示的使用
2006/06/22 Javascript
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
Python使用chardet判断字符编码
2015/05/09 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
印尼旅游网站:via
2017/11/12 全球购物
存储过程和函数的区别
2013/05/28 面试题
视图的作用
2014/12/19 面试题
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
应届生船舶驾驶求职信
2013/10/19 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
个人承诺书格式
2014/06/03 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python