我与python3擦肩而过,三—— 我去。。又是编码问题——urllib.parse.unquote

    记得初学python时就学的爬虫,经常遇到编码问题(其实在python3里面编码问题已经很少了。。。),用requests库就挺方便解决这些问题的。近来有共同学习python的程序员写了个电子书网站,想要相关的爬虫,于是,我去试了试。。。当然,第一步就遇到“编码问题”,这次requests就用不上啦。

    观察发现,小说网站搜索网页之后,跳转的网址形如:http://so.biquge.la/cse/search?s=7138806708853866527&q=%CD%EA%C3%C0%CA%C0%BD%E7

而且,查询不同的内容,变化的只是 &q= 之后的内容。开始以为是加密(好吧,我真的是小白。。。),大牛告诉说只是个编码。。。用到urllib.parse.unquote(在python2里面是urllib.unquote)。

    在python3里面具体是这样的:

from urllib import parse

city = parse.unquote('%E5%B1%B1%E8%A5%BF',)  # encoding='utf-8'
print(city)  # 山西

    这是请教别人的一个例子,完美运行了。但是当我去套用这个格式的时候,却出现了乱码。检查发现,和所在网页的编码方式有关(上面代码也截取自网页)。例子的网页的编码是UTF-8,而要解析的小说网站的编码是GBK。于是修改代码如下:

name = parse.unquote('%CE%E4%B6%AF%C7%AC%C0%A4', encoding='gb18030')  # gbk亦可
print(name)  # 武动乾坤

  也就是说,第一个例子中默认的是 encoding='utf-8'。(ps:关于GBK与GB18030,可参考这篇文章。)

到这里呢就算是能成功解码啦,于是。。。自然想到,就是怎么编回去呢?下面,“倒车”请注意:

x = parse.quote('武动乾坤', encoding='gb18030')
print(x)

  输出结果:

%CE%E4%B6%AF%C7%AC%C0%A4

  和想象中的一样简单,即,将unquote改为quote。

  至此,算是对编码问题又多一份了解,当然,以后路还很长呢!

  最后感谢群里面两位大神的相助@Irvine-宋前废帝,@福建-天涯。