天天看點

python中的一些解碼和編碼

開頭

最近爬取百度貼吧搜尋頁的時候遇到一個url的編碼問題,頗為頭疼,記錄下來防止下次忘記

工具網站

解碼編碼的工具網站推薦 ​​http://tool.chinaz.com/tools/urlencode.aspx​​

網址分析

當我們打開百度貼吧首頁輸入關鍵字并進行全吧搜尋的時候,就會得到一個傳回的url

python中的一些解碼和編碼
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拿到工具網站解析的時候,并不會傳回結果
      
python中的一些解碼和編碼

這個坑我查了很久,一直都解碼不成功,直到問了同僚,同僚說這個是 gb2312 的 url編碼!

人傻了,馬上試試

果然成功了! 學到,原來url編碼也分 gb2312 和 utf-8 的

代碼應用

既然知道了這個Url是由 gb2312 編碼之後再 url 編碼生成的url,那這樣在程式中怎麼寫呢?

需要用到 urllib.parse 這個函數

urllib.parse 裡面三個方法:urlencode、quote 和 unquote, 分别對于編碼與解碼

對字元串進行urlencode編碼,就需要用到兩個方法urlencode和quote

#!/usr/bin/python3
# coding=utf-8
 
from urllib.parse import urlencode
payload = {
    "name": "中文",
    "who": "lages",
    "url": "UrlEncode編碼"
}
print(urlencode(payload))
      

運作之後 可以得到一個url編碼的鍵值對

quote方法能對字元串編碼,如下:

#!/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=測試
      

完。