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}

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.


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

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.


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

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.


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']} 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.