Parameter kueri URL untuk mendikte python

101

Apakah ada cara untuk mengurai URL (dengan beberapa pustaka python) dan mengembalikan kamus python dengan kunci dan nilai dari bagian parameter kueri dari URL?

Sebagai contoh:

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

hasil yang diharapkan:

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

Jawaban:

191

Gunakan urllib.parseperpustakaan :

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

Metode urllib.parse.parse_qs()and urllib.parse.parse_qsl()mengurai string kueri, dengan mempertimbangkan bahwa kunci dapat muncul lebih dari sekali dan urutan itu mungkin penting.

Jika Anda masih menggunakan Python 2, urllib.parsedipanggil urlparse.

Martijn Pieters
sumber
38

Untuk Python 3, nilai dari dikt dari parse_qsada dalam daftar, karena mungkin ada beberapa nilai. Jika Anda hanya menginginkan yang pertama:

>>> 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'}
reubano
sumber
1
Ini tidak unik untuk Python 3, Python 2 urllib.parse_qsjuga mengembalikan daftar nilai. Saya secara khusus menyebutkan ini dalam jawaban saya, omong-omong, Anda mungkin ingin menggunakan urllib.parse_qsl()sebagai gantinya dan melewati daftar yang dihasilkan dict()jika Anda hanya ingin nilai tunggal.
Martijn Pieters
Sepertinya perbedaan dengan parse_qlsadalah bahwa karena mengembalikan daftar tupel, mengkonversi yang untuk dict akan menjaga terakhir nilai bukan pertama . Ini tentu saja mengasumsikan ada banyak nilai untuk memulai.
reubano
11

Jika Anda memilih untuk tidak menggunakan 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("&") ]}

Jadi saya tidak akan menghapus apa yang ada di atas tapi jelas bukan itu yang harus Anda gunakan.

Saya pikir saya membaca beberapa jawaban dan mereka tampak sedikit rumit, jika Anda seperti saya, jangan gunakan solusi saya.

Gunakan ini:

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

dan untuk Python 2.X

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

Saya tahu ini sama dengan jawaban yang diterima, hanya dalam satu baris yang dapat disalin.

Tomos Williams
sumber
7
Parsing melibatkan lebih dari sekadar memisahkan string. Anda juga perlu menangani pengkodean URL (termasuk +), dan urllib.parsejuga memunculkan atau mengabaikan kesalahan untuk Anda seperti yang diminta. Saya tidak yakin mengapa Anda ingin menemukan kembali roda ini ketika itu adalah bagian dari pustaka standar.
Martijn Pieters
6

Untuk 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'}
Anurag Misra
sumber
5

Saya setuju untuk tidak menemukan kembali roda tetapi kadang-kadang (saat Anda sedang belajar) membangun roda untuk memahami roda itu membantu. :) Jadi, dari perspektif akademis murni, saya menawarkan ini dengan peringatan bahwa menggunakan kamus mengasumsikan bahwa pasangan nilai nama adalah unik (bahwa string kueri tidak berisi banyak catatan).

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

Saya menggunakan versi 3.6.5 di Idle IDE.

Clarius
sumber
0

Karena python2.7saya menggunakan urlparsemodul untuk mengurai kueri url menjadi dikt.

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']} 
Tamim
sumber