从URL检索参数


164

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

/abc?def='ghi'

我在我的环境中使用Django;有没有一种方法request可以帮助我?

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

Answers:


255

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
from urllib.parse import parse_qs
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(parse_qs(parsed.query)['def'])

parse_qs返回值列表,因此上述代码将打印['ghi']

这是Python 3文档。


58
在python3import urllib.parse as urlparse
伊凡德拉巴斯森特诺

26
请注意,这parse_qs将返回一个列表对象。如果需要字符串,则需要获取它的第一个元素urlparse.parse_qs(parsed.query)['def'][0]
raffaem '17

3
请注意,如果url像这样包含'#'字符:foo.appspot.com/ #/ abc?def=ghi,则必须禁止使用分片:urlparse(url, allow_fragments=False),否则查询将返回空str。
codezjx

2
在python3,必须使用from urllib.parse import urlparse, parse_qsparse_qs(parsed.query)
deathemperor

1
@FrancescoFrassinelli这是有效的。urlparse.urlparse(url)->urlparse(url)
Winand

55

我很震惊这个解决方案还没有在这里。用:

request.GET.get('variable_name')

这将从“ GET”字典中“获取”变量,并返回“ variable_name”值(如果存在),或者返回None对象(如果不存在)。


3
这应该是最佳答案。奇迹般有效。
muntasir2000 '02

2
我不得不离开self,但我同意以上评论。
Matt Cremeens

我无法使它正常工作。也许更多细节。您如何获得请求?这个python3兼容吗?
ggedde

3
@ggedde这个答案(就像问题一样)是针对django的,它是django请求的对象。如果您没有使用django,请使用其他答案之一。
Florian

55
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]

46

对于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
IMO的最佳方法。不需要额外的程序包,可以在Python 3.5上运行A +。
wanaryytel

22

有一个名为furl的新库。我发现这个库是执行url代数的最pythonic。安装:

pip install furl

码:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

3
很棒的图书馆!对此一无所知,但就像一个魅力:)
pasql

3
:)我浪费了我的时间,试图使urlparse为我工作。不再。
Mayank Jaiswal

18

我知道这有点晚了,但是自从我今天在这里找到自己以来,我认为这对其他人可能是一个有用的答案。

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(),“将数据作为名称,值对的列表返回。”



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)

希望这可以帮助


在Webapp内部,这不是必需的。
尼克·约翰逊,


3

不需要做任何事情。只有

self.request.get('variable_name')

注意,我没有指定方法(GET,POST等)。这是有据可查的这是一个示例

您使用Django模板的事实并不意味着处理程序也由Django处理


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]

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

0

顺便说一句,我在使用parse_qs()并获取空值参数时遇到了问题,并了解到您必须传递第二个可选参数'keep_blank_values'才能在查询字符串中返回不包含任何值的参数列表。默认为false。某些糟糕的书面API要求参数存在,即使它们不包含任何值

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0

有一个不错的库w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

0

参数= dict([part.split('=')代表get_parsed_url [4] .split('&')]的部分)

这很简单。可变参数将包含所有参数的字典。


0

我看到龙卷风用户没有答案:

key = self.request.query_arguments.get("key", None)

此方法必须在派生自以下对象的处理程序中起作用:

tornado.web.RequestHandler

当找不到所请求的密钥时,此方法将返回的答案是无。这为您节省了一些异常处理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.