web-dev-qa-db-fra.com

Paramètres de requête d'URL à dicter python

Existe-t-il un moyen d’analyser une URL (avec une bibliothèque python) et de renvoyer un dictionnaire python avec les clés et les valeurs d’une partie des paramètres de requête de l’URL ?

Par exemple:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

retour attendu:

{'ct':32, 'op':92, 'item':98}
73
Leonardo Andrade

Utilisez la bibliothèque urllib.parse :

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

Les méthodes urllib.parse.parse_qs() et urllib.parse.parse_qsl() analysent les chaînes de requête, en tenant compte du fait que des clés peuvent apparaître plusieurs fois et que cet ordre peut avoir de l'importance.

Si vous êtes toujours sur Python 2, urllib.parse A été appelé urlparse .

137
Martijn Pieters

Pour Python 3, les valeurs du dict de parse_qs sont dans une liste, car il peut y avoir plusieurs valeurs. Si vous voulez juste le premier:

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}
25
reubano

Si vous préférez ne pas utiliser d'analyseur:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

Donc, je ne supprimerai pas ce qui précède, mais ce n'est certainement pas ce que vous devriez utiliser.

Je pense avoir lu quelques réponses et elles semblaient un peu compliquées. Si vous êtes comme moi, n'utilisez pas ma solution.

Utilisez ceci:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

et pour Python 2.X

from urllib import urlparse as parse

Je sais que c’est la même chose que la réponse acceptée, mais dans une seule ligne qui peut être copiée.

7
Tomos Williams

Pour python 2.7

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}
4
Anurag Misra

Je suis d'accord pour ne pas réinventer la roue, mais parfois (pendant que vous apprenez), il est utile de construire une roue pour comprendre une roue. :) Donc, d'un point de vue purement académique, je propose ceci avec la mise en garde que l'utilisation d'un dictionnaire suppose que les paires nom-valeur sont uniques (que la chaîne de requête ne contient pas plusieurs enregistrements).

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

J'utilise la version 3.6.5 dans l'IDE inactif.

3
Clarius