网页抓取解密( 英文不好学起来挺困难的,百度了半天就没找到解决办法)
优采云 发布时间: 2022-02-25 05:01网页抓取解密(
英文不好学起来挺困难的,百度了半天就没找到解决办法)
分享python抓取网页时字符集转换问题的解决方案
更新时间:2014-06-19 09:45:07 提交人:hebedich
在学习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是key,下面继续
我们开始爬取百度首页。注意,访问者访问百度主页查看网页源代码时,其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,转码为utf-8。
总结:
我们回顾一下,如果需要按照指定的字符集保存字符串,有以下步骤:
1:使用unicode(str, "original encoding")将str解码成unicode字符串
2:将unicode字符串str转换成你使用str.encode("specified character set")指定的字符集
3:将str保存到文件,或者写入数据库等。当然,你已经指定了编码,对吧?