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}
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
.
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'}
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.
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'}
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.