Recuperando Parâmetros de um URL

164

Dado um URL como o seguinte, como posso analisar o valor dos parâmetros de consulta? Por exemplo, neste caso, eu quero o valor de def.

/abc?def='ghi'

Estou usando o Django no meu ambiente; existe um método no requestobjeto que poderia me ajudar?

Eu tentei usar, self.request.get('def')mas ele não está retornando o valor ghicomo eu esperava.

niteshb
fonte

Respostas:

256

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_qsretorna uma lista de valores, para que o código acima seja impresso ['ghi'].

Aqui está a documentação do Python 3.

systempuntoout
fonte
58
Em python3import urllib.parse as urlparse
Ivan De Paz Centeno
26
Observe que parse_qsvocê retornará um objeto de lista. Você precisa obter o primeiro elemento que se você quiser uma stringurlparse.parse_qs(parsed.query)['def'][0]
raffaem
3
Observe que se o URL contiver o caractere '#' assim: foo.appspot.com/#/abc?def=ghi , você deverá desabilitar fragmentos :,urlparse(url, allow_fragments=False) caso contrário, a consulta retornará str vazio.
codezjx
2
em python3, deve usar from urllib.parse import urlparse, parse_qseparse_qs(parsed.query)
deathemperor
1
@FrancescoFrassinelli é válido. urlparse.urlparse(url)->urlparse(url)
Winand
55

Estou chocado que esta solução ainda não esteja aqui. Usar:

request.GET.get('variable_name')

Isso "obterá" a variável do dicionário "GET" e retornará o valor 'variable_name', se existir, ou um objeto None, se não existir.

jball037
fonte
3
Essa deve ser a resposta principal. Funciona como um encanto.
muntasir2000
2
Eu tive que sair self, mas concordo com o comentário acima.
precisa saber é o seguinte
Não consigo fazer isso funcionar. Talvez mais alguns detalhes. Como você está recebendo a solicitação? Este python3 é compatível?
ggedde
3
@ggedde esta resposta (como a pergunta) é para django, é um objeto de solicitação de django. Se você não estiver usando django, use uma das outras respostas.
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]
Cris
fonte
46

para 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]
Anatoly E
fonte
4
Melhor maneira de fazê-lo IMO. Não precisa de pacotes extras e funciona com o A + no Python 3.5.
Wanaryytel 6/04
23

Existe uma nova biblioteca chamada furl. Acho que esta biblioteca é mais pitônica para fazer álgebra de URL. Para instalar:

pip install furl

Código:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']
Mayank Jaiswal
fonte
3
Ótima biblioteca! Não sabia sobre isso, mas funciona como um encanto :)
pasql
3
:) Eu perdi minha parte do tempo tentando fazer o urlparse funcionar para mim. Não mais.
Mayank Jaiswal
18

Eu sei que é um pouco tarde, mas desde que me encontrei aqui hoje, pensei que essa poderia ser uma resposta útil para os outros.

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

Com parse_qsl (), "Os dados são retornados como uma lista de nome, pares de valores".

iCanHasFay
fonte
5

O URL que você está se referindo é um tipo de consulta e vejo que o objeto de solicitação suporta um método chamado argumentos para obter os argumentos da consulta. Você também pode querer tentar self.request.get('def')diretamente obter seu valor do objeto.

Senthil Kumaran
fonte
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)

Espero que isto ajude

inspectorG4dget
fonte
Isso não deve ser necessário dentro de um aplicativo da web.
Nick Johnson
3

O módulo urlparse fornece tudo o que você precisa:

urlparse.parse_qs ()

Andreas Jung
fonte
3

Não é necessário fazer nada disso. Somente com

self.request.get('variable_name')

Observe que não estou especificando o método (GET, POST, etc). Isso está bem documentado e este é um exemplo

O fato de você usar modelos do Django não significa que o manipulador também seja processado pelo Django

chachan
fonte
3

Em Python puro:

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]
Asym
fonte
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
George
fonte
0

Btw, eu estava tendo problemas usando parse_qs () e obtendo parâmetros de valor vazio e aprendi que é preciso passar um segundo parâmetro opcional 'keep_blank_values' para retornar uma lista dos parâmetros em uma string de consulta que não contém valores. O padrão é false. Algumas APIs escritas ruins exigem que os parâmetros estejam presentes, mesmo que não contenham valores

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

Existe uma boa biblioteca w3lib.url

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

parâmetros = dict ([part.split ('=') para parte em get_parsed_url [4] .split ('&')]))

Este é simples. Os parâmetros variáveis ​​conterão um dicionário de todos os parâmetros.

Mayuresh Satao
fonte
0

Vejo que não há uma resposta para os usuários do Tornado:

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

Este método deve funcionar dentro de um manipulador derivado de:

tornado.web.RequestHandler

Nenhuma é a resposta que esse método retornará quando a chave solicitada não puder ser encontrada. Isso economiza um tratamento de exceção.

Oren_C
fonte