2017-02-20 8 views
1

私はPython 3と、RESTサービスを照会するためのモジュール/ライブラリを使用します。python3リクエストはquote_plusの代わりに引用符を使用します

デフォルトでは、リクエストはurllib.parse.quote_plus()というURLエンコードに使用されています。つまり、スペースは+に変換されます。

ただし、RESTサービスのIクエリでは、andと誤って解釈されます。ですから、%20というようにスペースをエンコードする必要があります。代わりにurllib.parse.quote()を使用してください。

リクエストでこれを行う簡単な方法はありますか?私はドキュメンテーションで何のオプションも見つけられませんでした。

+1

リクエストに渡す前に、urllib.parse.quote()を使用してURLをエンコードすることができます。既にエンコードされているので、要求はそれ以上のフォーマットを試みません。 – Neelik

+0

ありがとう、これは動作します。しかし、私はリクエスト/ 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

ありがとうございます。あなたは正しいですが、そのようにすれば、requote_uriは明らかにURL全体を必要とするため、要求をrequest.get(url、params = dict)に 'params 'として追加するという素晴らしいリクエスト機能が失われます。代わりにUrllibを使うと、dict: '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

関連する問題