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新手在作用域方面经常容易碰到的问题
Apr 03 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
python矩阵转换为一维数组的实例
Jun 05 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Python3.7+tkinter实现查询界面功能
Dec 24 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
Python并发爬虫常用实现方法解析
Nov 19 Python
Pytest allure 命令行参数的使用
Apr 18 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冒泡排序算法代码详细解读
2011/07/17 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
js控制的遮罩层实例介绍
2013/05/29 Javascript
jquery动态增加text元素以及删除文本内容实例代码
2013/07/01 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
2016/07/14 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
pytorch构建多模型实例
2020/01/15 Python
Python使用configparser库读取配置文件
2020/02/22 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
关于Assembly命名空间的三个面试题
2015/07/23 面试题
2014年教研室工作总结
2014/12/06 职场文书
运动会开幕词
2015/01/28 职场文书
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS