Récupérer les paramètres d'une URL

164

Étant donné une URL comme celle-ci, comment puis-je analyser la valeur des paramètres de requête? Par exemple, dans ce cas, je veux la valeur de def.

/abc?def='ghi'

J'utilise Django dans mon environnement; y a-t-il une méthode sur l' requestobjet qui pourrait m'aider?

J'ai essayé de l'utiliser self.request.get('def')mais cela ne renvoie pas la valeur ghique j'espérais.

niteshb
la source

Réponses:

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_qsrenvoie une liste de valeurs, donc le code ci-dessus s'imprimera ['ghi'].

Voici la documentation Python 3.

systempuntoout
la source
58
In python3import urllib.parse as urlparse
Ivan De Paz Centeno
26
Notez que parse_qsvous renverra un objet de liste. Vous devez en obtenir le premier élément si vous voulez une chaîneurlparse.parse_qs(parsed.query)['def'][0]
raffaem
3
Notez que si l'url contient le caractère '#' comme ceci: foo.appspot.com/#/abc?def=ghi , vous devez interdire les fragments :,urlparse(url, allow_fragments=False) sinon la requête renverra str vide.
codezjx
2
en python3, doit utiliser from urllib.parse import urlparse, parse_qsetparse_qs(parsed.query)
deathemperor
1
@FrancescoFrassinelli c'est valide. urlparse.urlparse(url)->urlparse(url)
Winand le
55

Je suis choqué que cette solution ne soit pas déjà disponible. Utilisation:

request.GET.get('variable_name')

Cela "récupérera" la variable du dictionnaire "GET", et retournera la valeur 'nom_variable' si elle existe, ou un objet None si elle n'existe pas.

jball037
la source
3
Cela devrait être la meilleure réponse. Fonctionne comme un charme.
muntasir2000
2
J'ai dû m'arrêter self, mais je suis d'accord avec le commentaire ci-dessus.
Matt Cremeens
Je ne peux pas faire fonctionner ça. Peut-être quelques détails supplémentaires. Comment recevez-vous la demande? Est-ce compatible avec python3?
ggedde
3
@ggedde cette réponse (comme la question) est pour django, c'est un objet de requête django. si vous n'utilisez pas django, utilisez l'une des autres réponses.
Florian le
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
la source
46

pour 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
la source
4
Meilleur moyen de le faire IMO. N'a pas besoin de packages supplémentaires et fonctionne A + sur Python 3.5.
wanaryytel
23

Il existe une nouvelle bibliothèque appelée furl. Je trouve que cette bibliothèque est la plus pythonique pour faire de l'algèbre url. À installer:

pip install furl

Code:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']
Mayank Jaiswal
la source
3
Grande bibliothèque! Je ne savais pas à ce sujet mais fonctionne comme un charme :)
pasql
3
:) J'ai perdu ma part de temps à essayer de faire fonctionner urlparse pour moi. Pas plus.
Mayank Jaiswal
18

Je sais que c'est un peu tard, mais depuis que je me suis retrouvé ici aujourd'hui, j'ai pensé que cela pourrait être une réponse utile pour les autres.

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

Avec parse_qsl (), "Les données sont renvoyées sous forme de liste de paires de noms et de valeurs."

iCanHasFay
la source
5

L'url que vous faites référence est un type de requête et je vois que l'objet de requête prend en charge une méthode appelée arguments pour obtenir les arguments de requête. Vous pouvez également essayer self.request.get('def')d'obtenir directement votre valeur à partir de l'objet.

Senthil Kumaran
la source
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)

J'espère que cela t'aides

inspecteurG4dget
la source
Cela ne devrait pas être nécessaire dans une application Web.
Nick Johnson
3

Le module urlparse fournit tout ce dont vous avez besoin:

urlparse.parse_qs ()

Andreas Jung
la source
3

Il n'y a rien de cela à faire. Seulement avec

self.request.get('variable_name')

Notez que je ne spécifie pas la méthode (GET, POST, etc.). Ceci est bien documenté et ceci est un exemple

Le fait que vous utilisiez des modèles Django ne signifie pas que le gestionnaire est également traité par Django

chachan
la source
3

En pur 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]
Asym
la source
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
la source
0

Btw, j'avais des problèmes en utilisant parse_qs () et en obtenant des paramètres de valeur vides et j'ai appris que vous devez passer un deuxième paramètre facultatif 'keep_blank_values' pour renvoyer une liste des paramètres dans une chaîne de requête qui ne contient aucune valeur. La valeur par défaut est false. Certaines API écrites de merde exigent que des paramètres soient présents même s'ils ne contiennent aucune valeur

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

Il y a une belle bibliothèque w3lib.url

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

parameters = dict ([part.split ('=') pour une partie dans get_parsed_url [4] .split ('&')])

Celui-ci est simple. Les paramètres variables contiendront un dictionnaire de tous les paramètres.

Mayuresh Satao
la source
0

Je vois qu'il n'y a pas de réponse pour les utilisateurs de Tornado:

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

Cette méthode doit fonctionner dans un gestionnaire dérivé de:

tornado.web.RequestHandler

Aucune est la réponse que cette méthode renverra lorsque la clé demandée est introuvable. Cela vous évite de gérer les exceptions.

Oren_C
la source