从URL中检索参数

时间:2011-02-22 06:27:17

标签: python django parsing url

给定如下的URL,如何解析查询参数的值?例如,在这种情况下,我想要def

的值
/abc?def='ghi'

我在我的环境中使用Django; request对象上有一个可以帮助我的方法吗?

我尝试使用self.request.get('def'),但它没有像我希望的那样返回值ghi

18 个答案:

答案 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 documentedthis 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