从URL中获取参数

250

如何解析以下URL中的查询参数值?例如,在此情况下,我想要some_key的值是多少?

给定类似以下的URL:

http://www.example.com/?foo=bar&baz=qux&some_key=some_value
/some_path?some_key=some_value'
我在我的Django环境中使用;有没有request对象上的方法可以帮助我吗? 我尝试使用self.request.get('some_key'),但它并没有像我希望的那样返回值some_value
21个回答

425

这不仅适用于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'文档


62
在Python3中,import urllib.parse as urlparse 表示导入名为 urlparse 的模块,并将其别名为 urllib.parse - Ivan De Paz Centeno
34
请注意,parse_qs 函数将返回一个列表对象。如果您需要一个字符串,请获取它的第一个元素:urlparse.parse_qs(parsed.query)['def'][0] - robertspierre
4
请注意,如果url包含像这样的“#”字符:http://foo.appspot.com/#/abc?def=ghi,您必须禁止片段:'urlparse(url,allow_fragments = False)',否则查询将返回空字符串。 - codezjx
5
在Python3中,必须使用from urllib.parse import urlparse, parse_qsparse_qs(parsed.query) - deathemperor
1
@FrancescoFrassinelli 它是有效的。urlparse.urlparse(url) --> urlparse(url) - Winand
显示剩余4条评论

91

我很惊讶这个解决方案还没有出现在这里。使用:

request.GET.get('variable_name')

这将会从“GET”字典中“获取”变量,并在存在变量名时返回'variable_name'的值,如果不存在则返回一个None对象。


1
我无法让它工作。也许需要更多的细节。你是如何获取请求的?这个是否兼容Python3? - ggedde
18
这个回答(和问题一样)是关于Django的,它是一个Django请求对象。如果你没有使用Django,请使用其他答案之一。 - Florian
def parse_category_page(self, response): product_id = response.GET.get('number') 不起作用,请求也不行。 - snh_nl
我很震惊,有人竟然添加了这个答案,并且获得了如此多的赞(开玩笑 ;))。一件事是从随机URL获取查询参数,另一件事是从使用Django或其他框架提供的端点内获取这些参数。这个答案是针对您正在使用Django精确提供的URL的情况。问题是关于一些随机的互联网URL...应该解析它。 - juan Isaza

70

适用于 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
在我看来,最好的方法是这样做。不需要额外的包,并且在Python 3.5上运行良好。 - wanaryytel

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

35

有一个名为 furl 的新库。我发现这个库在处理URL时最符合Pythonic风格。

安装:

pip install furl

代码:

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

4
好的图书馆!以前不知道,但它运作得非常好 :) - pasql
4
我曾经浪费了很多时间试图让urlparse适用于我的需求,现在不再这样了。 - Mayank Jaiswal

21

我知道这有点晚了,但既然今天我发现自己在这里,我想这可能对其他人有用。

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]

7
你所提到的URL是一个查询类型,我看到请求对象支持一种叫做arguments的方法来获取查询参数。你也可以尝试直接使用self.request.get('def')从对象中获取你的值。

6
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)

希望这能帮到你。

这在Web应用程序中不应该是必要的。 - Nick Johnson

4
urlparse模块提供了你所需的一切: urlparse.parse_qs()

这个回答提供了其他回答没有提供的内容吗? - Joshua Snider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接