私はPythonでrequests.get()を使用して次の形式のURLをGETしようとしています:
http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel
#!/usr/local/bin/python
import requests
print(requests.__versiom__)
url = 'http://api.example.com/export/'
payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}
r = requests.get(url, params=payload)
print(r.url)
ただし、URLのエンコードはパーセントで行われ、予期した応答が得られません。
2.2.1
http://api.example.com/export/?key=site%3Adummy%2Btype%3Aexample%2Bgroup%3Awheel&format=json
これは、URLを直接渡すと機能します。
url = http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel
r = requests.get(url)
パラメータを元の形式で渡す方法はありますか?パーセントエンコーディングなしで?
ありがとう!
良い解決策ではありませんが、string
を使用できます。
r = requests.get(url, params='format=json&key=site:dummy+type:example+group:wheel')
ところで:
payload = {'format': 'json', 'key': 'site:dummy+type:example+group:wheel'}
payload_str = "&".join("%s=%s" % (k,v) for k,v in payload.items())
# 'format=json&key=site:dummy+type:example+group:wheel'
r = requests.get(url, params=payload_str)
設計されたソリューションは、URLを直接渡すことです。
将来、他の誰かがこれに遭遇した場合、requests.Sessionをサブクラス化し、sendメソッドをオーバーライドし、生のURLを変更して、パーセントエンコーディングなどを修正できます。以下の修正を歓迎します。
import requests, urllib
class NoQuotedCommasSession(requests.Session):
def send(self, *a, **kw):
# a[0] is prepared request
a[0].url = a[0].url.replace(urllib.quote(","), ",")
return requests.Session.send(self, *a, **kw)
s = NoQuotedCommasSession()
s.get("http://somesite.com/an,url,with,commas,that,won't,be,encoded.")
上記の答えは私にはうまくいきませんでした。
パラメータにパイプが含まれるgetリクエストを実行しようとしましたが、pythonリクエストはパイプをパーセントエンコードするので、代わりにurlopenを使用しました。
# python3
from urllib.request import urlopen
base_url = 'http://www.example.com/search?'
query = 'date_range=2017-01-01|2017-03-01'
url = base_url + query
response = urlopen(url)
data = response.read()
# response data valid
print(response.url)
# output: 'http://www.example.com/search?date_range=2017-01-01|2017-03-01'
この github link の最初のオプションをご覧ください。 urlib
partは無視できます。つまり、prep.url = url
の代わりに prep.url = url + qry