首页 > 解决方案 > Pythons 请求库从 URL 中删除附加问号

问题描述

目标

提出http://example.com/page?使用要求requests.get()

问题

如果问号 ("?") 是 URL 中的最后一个字符,则会自动从请求中删除它(例如,http://example.com/page?1并且http://example.com/page?!有效,http://example.com/page?无效

示例代码

import requests

endpoint = "http://example.com/page?"
r = requests.get(endpoint)

print(r.url) # -> "http://example.com/page"
assert r.url == endpoint # Raises AssertionError

问题

在不修改库的情况下,是否有可能达到预期的端点?欢迎使用预期的解决方案(如果存在)和解决方法。

谢谢!

标签: pythonpython-requests

解决方案


图书馆不可能做到这一点。requests传入的 URLrequests被解析urllib3.util.url.parse_url()为单独的部分:

scheme
auth
host
port
path
query
fragment

获取queryURL 部分的逻辑假设查询字符串在 之后开始?,但由于问号之后没有任何内容,因此它给出了空白query。然后,当您打印时,该 URL 将被重构为字符串r.url。这就是 URL 没有尾随问号的原因。

不过,我发现您正在寻找的行为是可能的urllib.request。这是一个例子:

import urllib.request, urllib.error

try:
    response = urllib.request.urlopen("http://example.com/page?") 
    print(response.url)  # -> http://example.com/page?
except urllib.error.HTTPError as e:
    print(e.url)  # -> http://example.com/page?
    print(e.code) # -> 404

我已将请求包围在 a 中,try/except因为如果您尝试获取的页面给出 404,urllib则会引发错误,而在哪里requests会简单地忍受它。


推荐阅读