簡體   English   中英

如何防止 python 請求對我的 URL 進行百分比編碼?

[英]How to prevent python requests from percent encoding my URLs?

我正在嘗試在 python 中使用 requests.get() 獲取以下格式的 URL:

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轉換為此字符串的代碼

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)

編輯(2020):

您還可以使用urllib.parse.urlencode(...)和參數safe=':+'來創建字符串而不轉換字符:+

據我所知, requestsurllib.parse.urlencode(...)使用urllib.parse.urlencode(...)但沒有safe=

import requests
import urllib.parse

payload = {
    'format': 'json', 
    'key': 'site:dummy+type:example+group:wheel'
}

payload_str = urllib.parse.urlencode(payload, safe=':+')
# 'format=json&key=site:dummy+type:example+group:wheel'

url = 'https://httpbin.org/get'

r = requests.get(url, params=payload_str)

print(r.text)

我使用頁面https://httpbin.org/get來測試它。

按照設計,解決方案是直接傳遞 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.parse.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 鏈接中的第一個選項。 您可以忽略urlib部分,這意味着prep.url = url而不是prep.url = url + qry

從請求版本 2.26 開始,上述所有解決方案似乎都不再起作用。 來自 GitHub 存儲庫的建議解決方案似乎正在使用 PreparedRequest 的變通方法。

以下對我有用。 確保 URL 是可解析的,所以不要使用“this-is-not-a-domain.com”。

import requests

base_url = 'https://www.example.com/search'
query = '?format=json&key=site:dummy+type:example+group:wheel'

s = requests.Session()
req = requests.Request('GET', base_url)
p = req.prepare()
p.url += query
resp = s.send(p)
print(resp.request.url)

來源: https : //github.com/psf/requests/issues/5964#issuecomment-949013046

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM