将 & 符号更改为 %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

现在可以正常发送请求了。