给定如下的URL,如何解析查询参数的值?例如,在这种情况下,我想要def
。
/abc?def='ghi'
我在我的环境中使用Django; request
对象上有一个可以帮助我的方法吗?
我尝试使用self.request.get('def')
,但它没有像我希望的那样返回值ghi
。
答案 0 :(得分:198)
Python 2:
import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']
Python 3:
import urllib.parse as urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(urlparse.parse_qs(parsed.query)['def'])
答案 1 :(得分:52)
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]
答案 2 :(得分:41)
我很震惊这个解决方案已不在这里了。使用:
request.GET.get('variable_name')
这将从“GET”字典“获取”变量,并返回“variable_name”值(如果存在)或“None”对象(如果不存在)。
答案 3 :(得分:33)
for 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 :(得分:17)
有一个名为furl的新库。我发现这个库是做网址代数最pythonic的。 要安装:
pip install furl
代码:
from furl import furl
f = furl("/abc?def='ghi'")
print f.args['def']
答案 5 :(得分:17)
我知道这有点晚了但是因为我今天发现自己在这里,我认为这对其他人来说可能是一个有用的答案。
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(),“数据将作为名称,值对的列表返回。”
答案 6 :(得分:5)
您引用的url是一个查询类型,我看到请求对象支持一个名为arguments的方法来获取查询参数。您可能还需要直接尝试self.request.get('def')
来从对象中获取您的价值。
答案 7 :(得分:3)
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)
希望这有帮助
答案 8 :(得分:3)
纯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]
答案 9 :(得分:3)
没有必要这样做。只有
self.request.get('variable_name')
请注意,我没有指定方法(GET,POST等)。这是well documented和this is an example
使用Django模板的事实并不意味着处理程序也由Django处理
答案 10 :(得分:3)
urlparse模块提供您需要的一切:
urlparse.parse_qs()
答案 11 :(得分:2)
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
答案 12 :(得分:1)
有一个很好的库w3lib.url
from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi
答案 13 :(得分:0)
顺便说一句,我在使用parse_qs()并获取空值参数时遇到了问题,并了解到必须传递第二个可选参数'keep_blank_values'以返回不包含值的查询字符串中的参数列表。它默认为false。一些糟糕的书面API要求参数存在,即使它们不包含值
for k,v in urlparse.parse_qs(p.query, True).items():
print k
答案 14 :(得分:0)
参数= dict([part.split('=') get_parsed_url [4] .split('&')])
这很简单。可变参数将包含所有参数的字典。
答案 15 :(得分:0)
我看到龙卷风用户没有答案:
this.db.collection('meters').doc(this.newLeak.value.meter).collection('leaks').doc(this.newLeak.value.date).collection('apartments').doc(this.newLeak.value.apartment).set(JSON.stringify(this.newLeak.value)); // use JSON.stringify method here
此方法必须在派生自
的处理程序中起作用key = self.request.query_arguments.get("key", None)
当找不到所请求的密钥时,此方法将不会返回答案。这样可以节省一些异常处理。
答案 16 :(得分:0)
此处的大多数答案都建议使用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'}
答案 17 :(得分:0)
我不想弄乱其他库。这里建议的简单方法也不可行。最终,不在请求对象上,但是我可以通过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