刚接触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()方法,这个方法就是获取系统的编码方式
总结,最后问题解决了,回头一看感觉也不是什么大问题,但是在解决的过程中,却各处碰壁。