1. 程式人生 > >使用python對url編碼解碼

使用python對url編碼解碼

最近在抓取一些js程式碼產生的動態資料,需要模擬js請求獲得所需用的資料,遇到對url進行編碼和解碼的問題,就把遇到的問題總結一下,有總結才有進步,才能使學到的知識更加清晰。對url進行編碼和解碼,python提供了很方便的介面進行呼叫。 url中的query帶有特殊字元(不是url的保留字)時需要進行編碼。當url中帶有漢字時,需要特殊的處理才能正確編碼,以下都只針對這種情形,當然也適用於純英文字元的url。 (1) 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 (2) 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')  #反過來
函式呼叫的引數以及結果都是utf-8編碼的,所以在對url編碼時,需要將引數串的編碼從原始編碼轉換成utf-8, 對url解碼時,需要將解碼結果從utf-8轉換成原始編碼格式。 依據網站採用的編碼不同,或是gbk或是utf-8,賦賦予不同的編碼,進行不同的url轉碼。GBK格式,一箇中文字元轉為%xx%xx,共兩組;utf-8格式,一箇中文字元轉為%xx%xx%xx,共三組。
  1. >>> import sys,urllib   
  2. >>>s = '杭州'
  3. >>> urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))  
  4. %BA%BC%D6%DD  
  5. >>> urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))  
  6. '%E6%9D%AD%E5%B7%9E' 
a = "墨西哥女孩被拐4年接客4萬次 生的孩子成為人質-搜狐新聞"
print urllib.quote(urllib.quote(a))
進行兩次編碼轉換後,會變為:%25E5%25A2%25A8%25E8%25A5%25BF%25E5%2593%25A5%25E5%25A5%25B3%25E5%25AD%25A9%25E8%25A2%25AB%25E6%258B%25904%25E5%25B9.................................................................................這樣的形式。 同樣需要兩次解碼後才能得到中文。

最近用python寫了個小爬蟲自動下點東西,但是url 是含中文的,而且中文似乎是 gbk 編碼然後轉成 url的。舉個例子吧,我如果有個unicode字串“歷史上那些牛人們.pdf”,那麼我轉換成url之後是, 
t="%20%E5%8E%86%E5%8F%B2%E4%B8%8A%E9%82%A3%E4%BA%9B%E7%89%9B%E4%BA%BA%E4%BB%AC.pdf", 
但是對方網站給的是 s="%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF"
>>>print urllib.unquote("%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF").decode('gbk').encode('utf-8')
>>>歷史上那些牛人們.PDF