[英]How to prevent python requests from percent encoding URLs contain semicolon?
[英]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=':+'
來創建字符串而不轉換字符:+
。
據我所知, requests
也urllib.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.