¿Cómo evitar que las solicitudes de Python codifiquen mis URL?

Estoy intentando obtener una URL del siguiente formato usando requests.get () en python:

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) 

Sin embargo, la URL se codifica en porcentaje y no obtengo la respuesta esperada.

 2.2.1 http://api.example.com/export/?key=site%3Adummy%2Btype%3Aexample%2Bgroup%3Awheel&format=json 

Esto funciona si paso la URL directamente:

 url = http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wheel r = requests.get(url) 

¿Hay alguna forma de pasar los parámetros en su forma original, sin el porcentaje de encoding?

¡Gracias!

No es una buena solución pero puedes usar una string :

 r = requests.get(url, params='format=json&key=site:dummy+type:example+group:wheel') 

Por cierto:

 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) 

La solución, tal como fue diseñada, es pasar la URL directamente.

En caso de que alguien más lo descubra en el futuro, puede hacer una subclase de solicitudes. Sesión, anular el método de envío y modificar la url sin procesar, para corregir el porcentaje de codificaciones y similares. Las correcciones a continuación son bienvenidas.

 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.") 

Las respuestas anteriores no funcionaron para mí.

Estaba tratando de hacer una solicitud de obtención donde el parámetro contenía una canalización, pero las solicitudes de python también codificarían el porcentaje. Así que en su lugar usé 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' 

Por favor, eche un vistazo a la primera opción en este enlace github . Puede ignorar la parte urlib que significa prep.url = url lugar de prep.url = url + qry