python2和python3對於url的解碼和編碼

本文轉載:https://www.cnblogs.com/lyxdw/p/9935137.html

某天做爬蟲時遇到一個post請求的參數是編碼過的字符串如下,看不懂,初步判斷可能是url編碼

str = "%7B%22ShoppingToken%22%3A%22NewAirChina%257CCA4173%252C1%252C%252C12-CA989%252C1%252C%252C12%257CY%252CV%252C-Y%252CV%252C%257C0%257C3430%252C1564%252CCAGJ-CA%257CNOR%257C%22%2C%22Eligibility%22%3A%22NOR%22%7D"

對於不瞭解url編碼,解碼的同學,我簡單解釋一下,也可以參考  http://www.w3school.com.cn/tags/html_ref_urlencode.html

  URL爲何要編碼、解碼?

      通常如果一樣東西需要編碼,說明這樣東西並不適合傳輸。原因多種多樣,如Size過大,包含隱私數據。對於Url來說,之所以要進行編碼,是因爲Url中有些字符會引起歧義。

      例如,Url參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那麼勢必會造成接收Url的服務器解析錯誤,因此必須將引起歧義的&和=符號進行轉義,也就是對其進行編碼。

      又如,Url的編碼格式採用的是ASCII碼,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務端瀏覽器支持的字符集不同的情況下,中文可能會造成問題。

 

百度了一下python解碼url找到了解決辦法,感謝 https://blog.csdn.net/junli_chen/article/details/50060161

直接把代碼貼過來

複製代碼

#url編碼:
import urllib
url = 'http://test.com/s?wd=哈哈'   #如果此網站編碼是gbk的話,需要進行解碼,從gbk解碼成unicode,再從Unicode編碼編碼爲utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
#結果: http%3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88

#url解碼:
import urllib
encoded_url = 'http%3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace')  #反過來

複製代碼

使用了python2的語法,我使用的python3,所以改了一下語法,發現還不好使,quote報錯了

查了查資料原來python3中qutoe和unqutoe被放到了urllib.parse中(python2是在urllib中)    

 

下面貼上python3解碼編碼的代碼:

複製代碼

#解碼
from urllib import parse
encoded_url = '%7B%22ShoppingToken%22%3A%22NewAirChina%257CCA4173%252C1%252C%252C12-CA989%252C1%252C%252C12%257CY%252CV%252C-Y%252CV%252C%257C0%257C3430%252C1564%252CCAGJ-CA%257CNOR%257C%22%2C%22Eligibility%22%3A%22NOR%22%7D'
print(parse.unquote(encoded_url)

複製代碼

#編碼
from urllib import parse
url = '{"ShoppingToken":"NewAirChina%7CCA4173%2C1%2C%2C12-CA989%2C1%2C%2C12%7CY%2CV%2C-Y%2CV%2C%7C0%7C3430%2C1564%2CCAGJ-CA%7CNOR%7C","Eligibility":"NOR"}'
print(parse.quote(url))

解碼完成發現還有 %&%2之類的沒關係,我們把未解密的字符串拿出來再來一次

python2的代碼可以參考上面,因爲我沒裝python2,有興趣的可以自己試一試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章