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

问题提出:

    有时候我们采集网页,处理完毕后将字符串保存到文件或者写入数据库,这时候需要制定字符串的编码,如果采集网页的编码是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 字符集转换、python 字符集、python字符集设置、python 默认字符集、python mysql 字符集,以便于您获取更多的相关知识。

时间: 2024-08-30 14:53:20

python抓取网页时字符集转换问题处理方案分享_python的相关文章

编码-python抓取网页,网页源码无法解码

问题描述 python抓取网页,网页源码无法解码 抓取的网页:http://esf.nanjing.fang.com/ 浏览器查看源码显示content="text/html; charset=gb2312" python chardet 结果显示{'confidence': 0.0, 'encoding': None} 通过page=page.decode('gb2312','ignore').encode('utf-8'),解码后print为乱码 求问应该如何对这个网页的源代码进行

求教如何通过python抓取网页中表格信息

问题描述 求教如何通过python抓取网页中表格信息 刚刚开始学习python 不清楚如何通过python抓取网页中的表格信息 比如给定一个student.html 里面有学号.姓名.性别等信息 怎么样写才能够输入学号 读出其他信息? 解决方案 用正则表达式,表格数据放在table->tr->td中 解决方案二: 输入学号然后服务器在给你其他数据,应该是一个post的过程-你可以抓包看一下整个过程-至于提取特定的信息,你可以先看下整个表格的结构,再有针对性的写个正则表达式来提取出信息- 解决方

python抓取网页图片

# -*- coding: utf-8 -*- #--------------------------------------- # 程序:网页图片抓取 # 作者:lqf # 日期:2013-08-10 # 语言:Python 2.7 # 功能:抓取网页jpg链接图片 #--------------------------------------- import re import string import sys import os import urllib url="http://tie

python抓取网页图片并放到指定文件夹_python

python抓取网站图片并放到指定文件夹 复制代码 代码如下: # -*- coding=utf-8 -*-import urllib2import urllibimport socketimport osimport redef Docment():    print u'把文件存在E:\Python\图(请输入数字或字母)'    h=raw_input()    path=u'E:\Python\图'+str(h)    if not os.path.exists(path):      

关于使用webbrowser控件批量抓取网页时遇到的问题

问题描述 由于有很多网址,并且很多都是带有js跳转的动态页面,于是只能使用浏览器对象.现在的工作方式是,以每个线程配备一个browser对象,所有线程依次从文件中获取需要访问的网址,并且访问时间是被限定的如果超时,则判定访问失败,然后将访问成功与否的结果输出到另一个文件进行汇总.这样的工作方式就是,当启动50个线程时,就有50个webbrowser在运行然而现在遇到的问题是,不同的线程数抓取的成功率也会不同.比如现在有100个网址,2个线程时只失败6个:而20个线程时则失败17个.这是为何?是网

用C#.net抓取网页时为什么出现这种问题?怎么抓了电信的页面去了呢?

问题描述 Uriurl=newUri("http://www.baidu.com");WebRequestrequestPage=WebRequest.Create(url);//发送absoluteUri创建请求对象//requestPage.Timeout=1000;WebResponsereponsePage=requestPage.GetResponse();StreamnewsStream=reponsePage.GetResponseStream();//读取页面流Enco

python抓取网页图片示例(python爬虫)_python

复制代码 代码如下: #-*- encoding: utf-8 -*-'''Created on 2014-4-24 @author: Leon Wong''' import urllib2import urllibimport reimport timeimport osimport uuid #获取二级页面urldef findUrl2(html):    re1 = r'http://tuchong.com/\d+/\d+/|http://\w+(?<!photos).tuchong.co

深度剖析使用python抓取网页正文的源码_python

本方法是基于文本密度的方法,最初的想法来源于哈工大的<基于行块分布函数的通用网页正文抽取算法>,本文基于此进行一些小修改. 约定:       本文基于网页的不同行来进行统计,因此,假设网页内容是没有经过压缩的,就是网页有正常的换行的.        有些新闻网页,可能新闻的文本内容比较短,但其中嵌入一个视频文件,因此,我会给予视频较高的权重:这同样适用于图片,这里有一个不足,应该是要根据图片显示的大小来决定权重的,但本文的方法未能实现这一点.        由于广告,导航这些非正文内容通常以

重开一贴,非常之急.(在线等) 用C#.net写爬虫抓取网页时为什么出现这种问题?

问题描述 Uriurl=newUri("http://www.baidu.com");WebRequestrequestPage=WebRequest.Create(url);//发送absoluteUri创建请求对象//requestPage.Timeout=1000;WebResponsereponsePage=requestPage.GetResponse();StreamnewsStream=reponsePage.GetResponseStream();//读取页面流Enco