【发布时间】:2011-07-01 18:45:03
【问题描述】:
给定如下 URL,如何解析查询参数的值?例如,在这种情况下,我想要some_key 的值。
/some_path?some_key=some_value'
我在我的环境中使用 Django; request 对象上是否有可以帮助我的方法?
我尝试使用self.request.get('some_key'),但它没有像我希望的那样返回值some_value。
【问题讨论】:
给定如下 URL,如何解析查询参数的值?例如,在这种情况下,我想要some_key 的值。
/some_path?some_key=some_value'
我在我的环境中使用 Django; request 对象上是否有可以帮助我的方法?
我尝试使用self.request.get('some_key'),但它没有像我希望的那样返回值some_value。
【问题讨论】:
这不是特定于 Django 的,而是针对一般 Python 的。对于 Django 特定的答案,来自@jball037 的see this one
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
【讨论】:
import urllib.parse as urlparse
parse_qs 将返回一个列表对象。如果你想要一个字符串urlparse.parse_qs(parsed.query)['def'][0],你需要获取它的第一个元素
urlparse(url, allow_fragments=False),否则查询将返回空str。
from urllib.parse import urlparse, parse_qs和parse_qs(parsed.query)
urlparse.urlparse(url) --> urlparse(url)
我很震惊这里还没有这个解决方案。使用:
request.GET.get('variable_name')
这将从“GET”字典中“获取”变量,如果存在则返回“variable_name”值,如果不存在则返回 None 对象。
【讨论】:
self,但我同意上述评论。
对于 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]
【讨论】:
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]
【讨论】:
有一个名为 furl 的新库。我发现这个库最适合做 url 代数。 安装:
pip install furl
代码:
from furl import furl
f = furl("/abc?def='ghi'")
print f.args['def']
【讨论】:
我知道这有点晚了,但自从我今天发现自己在这里,我认为这对其他人可能是一个有用的答案。
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(),“数据以名称、值对列表的形式返回。”
【讨论】:
您引用的 url 是一个查询类型,我看到请求对象支持一种名为 arguments 的方法来获取查询参数。您可能还想直接尝试self.request.get('def') 以从对象中获取您的价值..
【讨论】:
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)
希望对你有帮助
【讨论】:
在纯 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]
【讨论】:
urlparse 模块提供你需要的一切:
urlparse.parse_qs()
【讨论】:
没有必要这样做。仅与
self.request.get('variable_name')
请注意,我没有指定方法(GET、POST 等)。这是well documented 和this is an example
您使用 Django 模板这一事实并不意味着处理程序也由 Django 处理
【讨论】:
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
【讨论】:
有一个不错的库 w3lib.url
from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
【讨论】:
这里的大多数答案建议使用 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'}
【讨论】:
顺便说一句,我在使用 parse_qs() 并获取空值参数时遇到问题,并了解到您必须传递第二个可选参数“keep_blank_values”才能返回查询字符串中不包含值的参数列表。它默认为假。一些蹩脚的 API 要求参数存在,即使它们不包含值
for k,v in urlparse.parse_qs(p.query, True).items():
print k
【讨论】:
parameters = dict([part.split('=') for part in get_parsed_url[4].split('&')])
这个很简单。可变参数将包含所有参数的字典。
【讨论】:
我发现 Tornado 用户没有答案:
key = self.request.query_arguments.get("key", None)
此方法必须在派生自的处理程序内工作:
tornado.web.RequestHandler
None 是当找不到请求的密钥时此方法将返回的答案。这为您节省了一些异常处理。
【讨论】:
我不想弄乱其他库。这里建议的简单方法也没有奏效。最后,不是在请求对象上,但我可以通过self.GET.get('XXX') 获得一个 GET 参数而无需任何麻烦:
...
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
【讨论】:
不使用 Django 并在 Python 3.9 上尝试过。也可以在处理程序中使用以下代码 sn-p 检索它:
考虑 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']
【讨论】: