从 URL 检索参数
- 2025-01-13 08:52:00
- admin 原创
- 122
问题描述:
给定如下 URL,我该如何解析查询参数的值?例如,在本例中我想要的值some_key
。
/some_path?some_key=some_value'
我在我的环境中使用 Django;request
对象上有没有可以帮助我的方法?
我尝试使用self.request.get('some_key')
,但它并没有像我所希望的那样返回值some_value
。
解决方案 1:
这不是针对 Django 的,而是针对 Python 的。有关 Django 的具体答案,请参阅@jball037 的这个答案
Python 2:
import urlparse
url = 'https://www.example.com/some_path?some_key=some_value'
parsed = urlparse.urlparse(url)
captured_value = urlparse.parse_qs(parsed.query)['some_key'][0]
print captured_value
Python 3:
from urllib.parse import urlparse
from urllib.parse import parse_qs
url = 'https://www.example.com/some_path?some_key=some_value'
parsed_url = urlparse(url)
captured_value = parse_qs(parsed_url.query)['some_key'][0]
print(captured_value)
parse_qs
返回一个列表。[0]
获取列表的第一项,因此每个脚本的输出是some_value
这是 Python 3 的“parse_qs”文档
解决方案 2:
我很震惊这个解决方案还没有出现在这里。使用:
request.GET.get('variable_name')
这将从“GET”字典中“获取”变量,如果存在则返回“variable_name”值,如果不存在则返回 None 对象。
解决方案 3:
对于 Python > 3.4
from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]
解决方案 4:
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)
print par['q'][0], par['p'][0]
解决方案 5:
有一个名为 furl 的新库。我发现这个库是执行 url 代数运算最符合 Python 风格的库。安装方法:
pip install furl
代码:
from furl import furl
f = furl("/abc?def='ghi'")
print f.args['def']
解决方案 6:
我知道这有点晚了,但因为我今天发现自己在这里,所以我认为这对其他人来说可能是一个有用的答案。
import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
print "Parameter = "+x,"Value = "+y
使用 parse_qsl(),“数据将作为名称、值对的列表返回。”
解决方案 7:
在纯 Python 中:
def get_param_from_url(url, param_name):
return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]
解决方案 8:
您引用的 URL 是查询类型,我看到请求对象支持一种名为参数的方法来获取查询参数。您可能还想self.request.get('def')
直接尝试从对象中获取值。
解决方案 9:
def getParams(url):
params = url.split("?")[1]
params = params.split('=')
pairs = zip(params[0::2], params[1::2])
answer = dict((k,v) for k,v in pairs)
希望这有帮助
解决方案 10:
没有必要做任何这些。只有
self.request.get('variable_name')
请注意,我没有指定方法(GET、POST 等)。这有据可查,这是一个例子
事实上,你使用 Django 模板并不意味着处理程序也会由 Django 处理
解决方案 11:
urlparse 模块提供了您所需要的一切:
urlparse.parse_qs()
解决方案 12:
import cgitb
cgitb.enable()
import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i
解决方案 13:
这里的大多数答案都建议使用parse_qs
来解析 URL 字符串。此方法始终将值作为列表返回(而不是直接作为字符串返回),因为参数可以出现多次,例如:
http://example.com/?foo=bar&foo=baz&bar=baz
将会返回:
{'foo': ['bar', 'baz'], 'bar' : ['baz']}
这有点不方便,因为在大多数情况下,您处理的 URL 不会多次包含相同的参数。此函数默认返回第一个值,并且只有当元素超过一个时才返回列表。
from urllib import parse
def parse_urlargs(url):
query = parse.parse_qs(parse.urlparse(url).query)
return {k:v[0] if v and len(v) == 1 else v for k,v in query.items()}
例如,http://example.com/?foo=bar&foo=baz&bar=baz
将返回:
{'foo': ['bar', 'baz'], 'bar': 'baz'}
解决方案 14:
有一个很好的库 w3lib.url
from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
解决方案 15:
在原始 Python 中解析它:
path = '/some_path?k1=v1&k2=v2&k3=v3'
_, query_string = path.split('?')
params = dict(param.split('=') for param in query_string.split('&'))
print(params)
输出:
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
解决方案 16:
顺便说一句,我在使用 parse_qs() 和获取空值参数时遇到了问题,并且了解到您必须传递第二个可选参数“keep_blank_values”才能返回查询字符串中不包含任何值的参数列表。它默认为 false。一些糟糕的 API 要求参数存在,即使它们不包含任何值
for k,v in urlparse.parse_qs(p.query, True).items():
print k
解决方案 17:
参数 = dict([part.split('=') for part in get_parsed_url[4].split('&')])
这个很简单。变量参数将包含所有参数的字典。
解决方案 18:
我发现 Tornado 用户没有答案:
key = self.request.query_arguments.get("key", None)
此方法必须在派生自以下处理程序内工作:
tornado.web.RequestHandler
当无法找到请求的密钥时,此方法将返回 None 答案。这为您节省了一些异常处理。
解决方案 19:
我不想使用额外的库。这里建议的简单方法也没有用。最后,不是在请求对象上,但我可以通过以下方式轻松获取 GET 参数self.GET.get('XXX')
:
...
def get_context_data(self, **kwargs):
context = super(SomeView, self).get_context_data(**kwargs)
context['XXX'] = self.GET.get('XXX')
...
Python 2.7.18,Django 1.11.20
解决方案 20:
您只能使用 request.GET.get() 方法
urls.py:
path('some_path', views.func),
视图.py:
def func(request):
some_key = request.GET.get('some_key', None)
...
解决方案 21:
不使用 Django,而是尝试使用 Python 3.9。也可以使用处理程序中的以下代码片段来检索它:
考虑 URL 作为
http://localhost:8081/api/v1/users?query_key=abcdef12345
和处理程序方法如下:
@routes.get('/api/v1/users')
async def handler_users(request):
query_key = request.url.query['query_key']