2017-02-20 207 views
1

我使用Python 3和requests模塊/庫來查詢REST服務。python3請求使用quote而不是quote_plus

看起來默認請求使用urllib.parse.quote_plus()進行urlencoding,即空格轉換爲+

但是,我查詢的REST服務將其誤解爲and。所以我需要將空格編碼爲%20,即使用urllib.parse.quote()代替。

有沒有一種簡單的方法來處理請求?我在文檔中找不到任何選項。

+1

您可以在將它傳遞到請求之前使用'urllib.parse.quote()'嘗試對URL進行編碼。由於它已經被編碼,所以請求不會嘗試進一步的格式化。 – Neelik

+0

謝謝,這個作品。但是,我可以只使用request/urllib3來做到這一點,並避免加載另一個模塊(urllib)? – absurd

回答

3

原來你可以!

from requests.utils import requote_uri 
url = "https://www.somerandom.com/?name=Something Cool" 
requote_uri(url) 

'https://www.somerandom.com/?name=Something%20Cool' 

documentation here requote_uri方法大約在頁面的一半處。

+0

謝謝。你是對的,但是這樣我就放棄了只需要將一個字典作爲'params'添加到requests.get(url,params = dict)的好的請求功能,因爲requote_uri顯然需要整個url。用Urllib代替,你可以處理一個字典:'urllib.parse.urlencode(dict,safe ='/',quote_via = urllib.parse.quote)''。那是對的嗎? – absurd

+1

這是正確的。請求庫在內部使用'urllib.parse.urlencode()','quote_via'參數設置爲'quote_plus'。我一直在研究是否有辦法通過'requests.get()'通過管道傳遞這個選項,看起來這是不可能的。幾年前,我發現[這個問題的線索](https://github.com/kennethreitz/requests/issues/369),導致我相信,由於他們處理百分比的困難,他們最終選擇了quote_plus路由。 (雖然這可以被認爲是一個巨大的飛躍) – Neelik

+2

謝謝。那麼,我現在正在考慮切換回urllib。 – absurd

相關問題