最近爬取百度贴吧搜索页的时候遇到一个url的编码问题,颇为头疼,记录下来防止下次忘记python
解码编码的工具网站推荐 http://tool.chinaz.com/tools/urlencode.aspxide
当咱们打开百度贴吧首页输入关键字并进行全吧搜索的时候,就会获得一个返回的url函数
https://tieba.baidu.com/f/search/res?isnew=1&kw=&qw=%BA%FE%C8%CB&rn=10&un=&only_thread=0&sm=1&sd=&ed=&pn=3 # 这个url拿到工具网站解析的时候,并不会返回结果
这个坑我查了好久,一直都解码不成功,直到问了同事,同事说这个是 gb2312 的 url编码!
人傻了,立刻试试工具
果真成功了! 学到,原来url编码也分 gb2312 和 utf-8 的测试
既然知道了这个Url是由 gb2312 编码以后再 url 编码生成的url,那这样在程序中怎么写呢?
须要用到 urllib.parse 这个函数网站
urllib.parse 里面三个方法:urlencode、quote 和 unquote, 分别对于编码与解码编码
对字符串进行urlencode编码,就须要用到两个方法urlencode和quoteurl
#!/usr/bin/python3 # coding=utf-8 from urllib.parse import urlencode payload = { "name": "中文", "who": "lages", "url": "UrlEncode编码" } print(urlencode(payload))
运行以后 能够获得一个url编码的键值对3d
quote方法能对字符串编码,以下:code
#!/usr/bin/python3 # coding=utf-8 from urllib.parse import quote print(quote("湖人")) url = "http://www.baidu.com/?a=湖人&b=sitven" print(quote(url))
这样,获得的整个url都编码了,而咱们通常只须要中文编码就好
知道上面两个方法,还有python自带的字符串解码就能够获得这样作
kw = '湖人' kw = quote(kw.encode('gb2312')) # 先经过字符串编码为gb2312,而后编码为url url = f"https://tieba.baidu.com/f/search/res?isnew=1&kw=&qw={qw}&" # 最后组合成一个url
问题解决以后,想着url编码怎么才能够解码成utf-8呢,就要用到 unquote 方法了。相似于%E4%B5%B7&b=E6%82%A0这种格式, 可经过unquote方法解码
unquote方法解码,
#!/usr/bin/python3 # coding=utf-8 from urllib.parse import unquote import requests url = "http://httpbin.org/get" payload = { "city": "洛杉矶", "site": "测试" } r = requests.get(url, params=payload) print(r.url) # http://httpbin.org/get?city=%E6%B4%9B%E6%9D%89%E7%9F%B6&site=%E6%B5%8B%E8%AF%95 print(unquote(r.url)) # http://httpbin.org/get?city=洛杉矶&site=测试
完。