How to prevent python requests from percent encoding my URLs?

前端 未结 5 681
故里飘歌
故里飘歌 2020-11-30 03:11

I\'m trying to GET an URL of the following format using requests.get() in python:

http://api.example.com/export/?format=json&key=site:dummy+type:example+group:wh

相关标签:
5条回答
  • 2020-11-30 03:25

    The solution, as designed, is to pass the URL directly.

    0 讨论(0)
  • 2020-11-30 03:28

    In case someone else comes across this in the future, you can subclass requests.Session, override the send method, and alter the raw url, to fix percent encodings and the like. Corrections to the below are welcome.

    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.")
    
    0 讨论(0)
  • 2020-11-30 03:39

    The answers above didn't work for me.

    I was trying to do a get request where the parameter contained a pipe, but python requests would also percent encode the pipe. So instead i used 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'
    
    0 讨论(0)
  • 2020-11-30 03:41

    Please have a look at the 1st option in this github link. You can ignore the urlibpart which means prep.url = url instead of prep.url = url + qry

    0 讨论(0)
  • 2020-11-30 03:42

    It is not good solution but you can use string:

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

    BTW:

    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)
    
    0 讨论(0)
提交回复
热议问题