将 & 符号更改为 %26
changing ampersands to %26
我正在使用 Python-requests
从网站提取数据。我目前正在这样做:
params = {'A':'something', 'B':'something'}
response = requests.get(url, params = params)
这给了我:https://someurl?query=&A=something&B=something
这一切都非常好。
但是,该网站不接受我的 API 呼叫。经过一番摸索,我发现我的目标 url 实际上是这样的:
https://someurl?query=%26A=something%26B=something
因此我的问题是:这个问题有解决方法吗?我梳理了请求的文档,但一无所获。我真的不想直接使用 url 因为我真的很喜欢 Python-requests
.
URL https://someurl?query=&A=something&B=something
与 URL https://someurl?query=%26A=something%26B=something
非常不同。
URL1 https://someurl?query=&A=something&B=something
被 HTTP 服务器解释为带有 3 个参数的请求:{
“询问”: ””,
“A”:“某事”,
“B”:“某事”
}
URL2 https://someurl?query=%26A=something%26B=something
被 HTTP 服务器解释为带有 1 个参数的请求:{
"query": "&A=something%26B=something"
}
其中“%26”被解码为“&”字符,因此值被解码为 &A=something&B=something
。
具有值为 &A=something&B=something
的单个参数“query”的 HTTP 查询需要正确编码,否则将被转换为错误的值。如果在请求中使用参数选项 API 那么编码会自动为您完成。
url = "http://localhost:8000"
params = {'query': '&A=something&B=something'}
response = requests.get(url, params=params)
print(response.status_code)
如果您想在幕后调试请求,请在调用 requests.get() 之前添加此内容。
import requests
import logging
# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
url = "http://localhost:8000"
params = {'query': '&A=something&B=something'}
response = requests.get(url, params=params)
输出:
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): localhost:8000
DEBUG:urllib3.connectionpool:http://localhost:8000 "GET /?query=%26A%3Dsomething%26B%3Dsomething HTTP/1.1" 200 5
请注意,URL 中的“=”也被编码以避免任何混淆,因为“&”和“=”是 URL 字符串中的特殊字符。
在向服务器发送请求之前尝试使用 urllib.parse.unquote()
:
from urllib.parse import unquote
url="https://someurl?query=%26A=something%26B=something"
print(unquote(url))
# https://someurl?query=&A=something&B=something
现在可以正常发送请求了。
我正在使用 Python-requests
从网站提取数据。我目前正在这样做:
params = {'A':'something', 'B':'something'}
response = requests.get(url, params = params)
这给了我:https://someurl?query=&A=something&B=something
这一切都非常好。
但是,该网站不接受我的 API 呼叫。经过一番摸索,我发现我的目标 url 实际上是这样的:
https://someurl?query=%26A=something%26B=something
因此我的问题是:这个问题有解决方法吗?我梳理了请求的文档,但一无所获。我真的不想直接使用 url 因为我真的很喜欢 Python-requests
.
URL https://someurl?query=&A=something&B=something
与 URL https://someurl?query=%26A=something%26B=something
非常不同。
URL1 https://someurl?query=&A=something&B=something
被 HTTP 服务器解释为带有 3 个参数的请求:{
“询问”: ””,
“A”:“某事”,
“B”:“某事”
}
URL2 https://someurl?query=%26A=something%26B=something
被 HTTP 服务器解释为带有 1 个参数的请求:{
"query": "&A=something%26B=something"
}
其中“%26”被解码为“&”字符,因此值被解码为 &A=something&B=something
。
具有值为 &A=something&B=something
的单个参数“query”的 HTTP 查询需要正确编码,否则将被转换为错误的值。如果在请求中使用参数选项 API 那么编码会自动为您完成。
url = "http://localhost:8000"
params = {'query': '&A=something&B=something'}
response = requests.get(url, params=params)
print(response.status_code)
如果您想在幕后调试请求,请在调用 requests.get() 之前添加此内容。
import requests
import logging
# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
url = "http://localhost:8000"
params = {'query': '&A=something&B=something'}
response = requests.get(url, params=params)
输出:
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): localhost:8000
DEBUG:urllib3.connectionpool:http://localhost:8000 "GET /?query=%26A%3Dsomething%26B%3Dsomething HTTP/1.1" 200 5
请注意,URL 中的“=”也被编码以避免任何混淆,因为“&”和“=”是 URL 字符串中的特殊字符。
在向服务器发送请求之前尝试使用 urllib.parse.unquote()
:
from urllib.parse import unquote
url="https://someurl?query=%26A=something%26B=something"
print(unquote(url))
# https://someurl?query=&A=something&B=something
现在可以正常发送请求了。