Parametri di query URL per dettare python


99

C'è un modo per analizzare un URL (con qualche libreria Python) e restituire un dizionario Python con le chiavi e i valori di una parte dei parametri di query dell'URL?

Per esempio:

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

ritorno previsto:

{'ct':32, 'op':92, 'item':98}

Risposte:


189

Usa la urllib.parselibreria :

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

I metodi urllib.parse.parse_qs()e urllib.parse.parse_qsl()analizzano le stringhe di query, tenendo conto che le chiavi possono ricorrere più di una volta e che l'ordine può essere importante.

Se sei ancora su Python 2, è urllib.parsestato chiamato urlparse.


37

Per Python 3, i valori del dict da parse_qssono in un elenco, perché potrebbero esserci più valori. Se vuoi solo il primo:

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

1
Questo non è esclusivo di Python 3, Python 2 urllib.parse_qsrestituisce anche elenchi per i valori. Lo menziono specificamente nella mia risposta, a proposito, potresti voler usare urllib.parse_qsl()invece e oltre l'elenco risultante dict()se vuoi solo valori singoli.
Martijn Pieters

Sembra che la differenza con parse_qlsè che dal momento che restituisce una lista di tuple, conversione che a un dict manterrà l' ultima valore invece della prima . Questo ovviamente presuppone che ci fossero più valori per cominciare.
reubano

11

Se preferisci non utilizzare un parser:

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("&") ]}

Quindi non cancellerò quanto sopra, ma sicuramente non è quello che dovresti usare.

Penso di aver letto alcune delle risposte e sembravano un po 'complicate, nel caso in cui tu sia come me, non usare la mia soluzione.

Usa questo:

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

e per Python 2.X

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

So che questa è la stessa della risposta accettata, solo in una riga che può essere copiata.


6
L'analisi implica qualcosa di più della semplice divisione della stringa. È inoltre necessario gestire la codifica dell'URL (incluso il +) e urllib.parseinoltre solleva o ignora gli errori per te come richiesto. Non sono sicuro del motivo per cui vorresti reinventare questa ruota quando fa parte della libreria standard.
Martijn Pieters

6

Per 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

Sono d'accordo sul non reinventare la ruota ma a volte (mentre stai imparando) aiuta a costruire una ruota per capire una ruota. :) Quindi, da una prospettiva puramente accademica, lo offro con l'avvertenza che l'utilizzo di un dizionario presuppone che le coppie di valori nome siano univoche (che la stringa di query non contenga più record).

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('&')]

Sto usando la versione 3.6.5 nell'IDE Idle.


0

Per python2.7sto usando il urlparsemodulo per analizzare la query dell'URL da dettare.

import urlparse

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

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.