unquote parse python url python-requests percent-encoding

parse - url unquote python 3



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

En caso de que alguien más lo descubra en el futuro, puede crear una subclase de solicitudes. Sesión, anular el método de envío y alterar 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.")

Estoy tratando de 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 codificación?

¡Gracias!


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


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''


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)


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