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.

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.


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.


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]

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]

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

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."


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.


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


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


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


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]

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

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

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

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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.