python中的编码问题
昨天写了第一个定向爬虫,然后爬了一些妹子的图片,然后今天想着爬部小说试试看,然后就暴露了一些问题。
就是编码以及转换的问题。
首先是找到目标网站,找准目标后,写好代码准备先爬一章试试看。
#-*-coding:utf8-*- import re import requests url = 'http://www.biqiuge.com/book/4772/2940354.html' # hea = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'} res = requests.get(url) html = res.text text_content = re.findall(' (.*?)<br />',html,re.S) print(text_content)
看着没什么问题,但是一运行,返回的确实一串乱码
这跟昨天不太一样啊,昨天能正常显示中文,然后我又试了试用昨天的方式把代码改了改。
#-*-coding:utf8-*- import re import requests url = 'http://www.biqiuge.com/book/4772/2940354.html' # hea = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'} res = requests.get(url) html = res.content.decode('utf-8') print(html)
这回直接运行 出错了,提示
Traceback (most recent call last):
File "F:/PycharmProjects/third_project/1.py", line 9, in <module>
html = res.content.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 373: invalid start byte
明明昨天的代码可以显示中文的。
这是昨天的代码
#-*-coding:utf8-*- import requests import re # get web source code url1 = 'http://enrz.com/fhm/2016/11/13/67848.html' r = requests.get(url1) html = r.content.decode('utf-8') print(html)
这是昨天的结果
同样是r.content.decode('utf-8')为什么一个能运行,而另一个却出错呢?这其中到底出了什么问题?哪个环节出错了呢?
于是开始了百度之旅,根据百度到的我从头开始捋一捋
首先,requests.get(url)返回的是一个response对象,response里有很多属性,比如,content,text,state_code,encoding,cookies,url,headers,raw等等,其中 content是bytes类型的,text是str类型的,而根据python的定义,python里的str是Unicode编码的,而bytes类型为utf-8编码的。而Unicode编码的str可以通过encode()方法编码成bytes类型、bytes类型的可以通过decode()解码成Unicode类型。其中encode()里面的参数为调用对象想要成为的编码类型,而decode()里的参数为调用对象本身的编码类型。
如以下例子:
s = '蟒蛇' print(type(s)) s1 = s.encode('utf-8') print(type(s1)) print(s1) s2 = s1.decode('utf-8') print(type(s2)) print(s2)
得到输出为
那么按道理来说只要我get的网页里面的内容是utf-8编码的,那么我应该可以直接通过 .text 属性或者 .content.decode('utf-8) 方式显示源代码里的中文啊,于是我想,会不会是我get的这个网页源代码里面的文字不是utf-8编码的?于是打开网页查看源代码:
可以看到,在网页源代码里是没有匹配到utf-8的字符的
没想到,里面的汉字使用的是'gbk'编码,据说现在大部分网址都是使用的utf-8编码了,没想到这个网站用的还是gbk编码,或许这就是编码出错的原因?因为当把网页换成百度的时候,无论用text还是.content.decode('utf-8)都是能显示中文的。问题的关键应该就在这里。另外找了好几个网站都ok。但是无论我怎么转换,先decode成Unicode再encode成gbk输出,还是乱码,实在是想不明白。
再捋一捋,首先网页从服务器上加载完,response给爬虫,服务器上肯定不会出错的,那就应该是爬虫这里出错了,在pycharm上运行的爬虫在接收到服务器的response后首先应该会用默认的编码方式(utf-8)对源码进行编码,然后再呈现给用户,那么问题应该出在这里,我后来在pacharm上的各种encode和decode都是在经过pycharm处理过后的‘源码’,所以翻过来覆过去无论我怎么编,怎么解,都是在乱码的基础上进行的。我暂时想不到解决办法。
折腾了一天,问题的根本还是没有解决,换了一个小说网站就好了,这只是表面解决了一波,但是也没白折腾,大概了解了python里的编码以及编码转换过程了。问题暂且搁置,慢慢琢磨。