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使用__slots__让你的代码更加节省内存
Sep 05 Python
Python使用while循环花式打印乘法表
Jan 28 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
Python语法分析之字符串格式化
Jun 13 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
Python实现点云投影到平面显示
Jan 18 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
Python自动创建Excel并获取内容
Sep 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中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
2018/07/30 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
node.js中的require使用详解
2014/12/15 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
python判断字符串是否纯数字的方法
2014/11/19 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
Python datetime 如何处理时区信息
2020/09/02 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
艺术设计专业个人求职信
2013/09/21 职场文书
行政经理的岗位职责
2013/11/23 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
2014年店长工作总结
2014/11/17 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android