pytho爬虫中文乱码解决方法

刚接触BeautifulSoup,在命令行输出爬取到网页的内容时,中文一直是乱码,很气。

中文乱码很容易想到是编码不对的问题,可是对编码方式的原理老姐也不多,对这个工具也不是很了解,只能硬着头皮去尝试,反正最后一定能解决

首先是遇到的问题

源码为

# -*-coding:utf-8 -*-
import urllib
import urllib2

url="http://www.baidu.com"
request=urllib2.Request(url)
response=urllib2.urlopen(request)
print response.read().decode("utf-8")
输入的结果为

提示很明显就是说编码问题,将utf-8改为gbk,依旧类似的错误

用BeautifulSoup的prettify依旧是这个问题,真的很气

如果将decode方法去掉,则可以输出爬取到的网页内容,只不过中文会是乱码。

中文乱码问题在编程中是非常常见的,但是解决起来就相当麻烦了。

一开始想到可能需要用网页的编码方式才行,所以找到charset工具(下载安装和使用教程点击),经过尝试没有解决问题

然后还是尝试了很多编码解码方式,包括ignore等,都不行

经过一天的尝试和询问终于找到解决方法

因为将网页内容输出到终端会乱码,但是保存到文件中就不会,所以应该是终端的编码问题,不是代码的问题

测试源码为

import urllib
import urllib2
import sys
type = sys.getfilesystemencoding()
url = 'http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
request=urllib2.Request(url)
html=urllib2.urlopen(request)
soup_packtpage = BeautifulSoup(html)  
print soup_packtpage.title
file =open("title.txt","w")
file.write(str(soup_packtpage.title))
print一个对象的逻辑:内部是调用对象的__str__得到对应的字符串的,此处对应的是soup的__str__ 而针对于soup本身,其实已经是Unicode编码,所以可以通过指定__str__输出时的编码为GBK,以使得此处正确显示非乱码的中文
而对于cmd:(中文的系统中)编码为GBK,所以只要重新编码为gb18030就可以正常输出了

所以修改源码为

import urllib
import urllib2
import sys
type = sys.getfilesystemencoding()
url = 'http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
request=urllib2.Request(url)
html=urllib2.urlopen(request)
soup_packtpage = BeautifulSoup(html)  
print soup_packtpage.prettify().encode('gb18030')
print soup_packtpage.title.encode('gb18030')
file =open("title.txt","w")
file.write(str(soup_packtpage.title))
这样就可以了

对于read的解决方法,也是这个问题

import urllib
import urllib2
import sys
type = sys.getfilesystemencoding()
url = 'http://category.dangdang.com/pg1-cp01.36.11.00.00.00-shlist.html'
request=urllib2.Request(url)
response=urllib2.urlopen(request)
print response.read().decode("gbk").encode(type)
这里用到了getfilesystemencoding()方法,这个方法就是获取系统的编码方式

总结,最后问题解决了,回头一看感觉也不是什么大问题,但是在解决的过程中,却各处碰壁。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值