最近爬取百度貼吧搜索頁的時候遇到一個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=測試
完。