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('&nbsp;&nbsp;&nbsp;&nbsp;(.*?)<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里的编码以及编码转换过程了。问题暂且搁置,慢慢琢磨。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值