Python dikte etmek için URL sorgu parametreleri


104

Bir URL'yi (bazı python kitaplıklarıyla) ayrıştırmanın ve URL'nin bir sorgu parametreleri kısmının anahtarları ve değerleri ile bir python sözlüğü döndürmenin bir yolu var mı?

Örneğin:

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

beklenen getiri:

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

Yanıtlar:


199

urllib.parseKitaplığı kullanın :

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

urllib.parse.parse_qs()Ve urllib.parse.parse_qsl()yöntemler tuşları kereden fazla ortaya çıkabilir ve bu sırası önemli olabileceğini dikkate alarak, sorgu dizeleri dışarı ayrıştırmak.

Hala Python 2'de iseniz urllib.parse, çağrıldı urlparse.


38

Python 3 için, parse_qsbirden fazla değer olabileceğinden, from dict'in değerleri bir listede yer alır. Sadece ilkini istiyorsan:

>>> 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
Bu Python 3'e özgü değildir, Python 2 urllib.parse_qsayrıca değerler için listeler döndürür. Cevabımda özellikle bundan bahsediyorum, bu arada, urllib.parse_qsl()bunun yerine kullanmak isteyebilir ve dict()sadece tek değerler istiyorsanız sonuç listesinin üzerine geçebilirsiniz .
Martijn Pieters

Görünüşe göre aradaki fark, parse_qlsbir tuple listesi döndürdüğü için , bunu bir dikteye dönüştürmek ilk yerine son değeri koruyacak olmasıdır . Bu, elbette, başlamak için birden çok değer olduğunu varsayar.
reubano

11

Ayrıştırıcı kullanmamayı tercih ediyorsanız:

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

Bu yüzden yukarıdakileri silmeyeceğim ama kesinlikle kullanmanız gereken şey bu değil.

Sanırım cevaplardan birkaçını okudum ve biraz karmaşık görünüyorlardı, eğer benim gibiyseniz, çözümümü kullanma.

Bunu kullan:

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

ve Python 2.X için

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

Bunun, kopyalanabilen tek bir satırda kabul edilen cevapla aynı olduğunu biliyorum.


8
Ayrıştırma, dizeyi bölmekten daha fazlasını içerir. Ayrıca URL kodlamasını (dahil +) işlemeniz gerekir ve urllib.parseayrıca istendiği gibi hataları sizin için artırır veya yok sayar. Standart kütüphanenin bir parçası olduğunda bu tekerleği neden yeniden icat etmek istediğinizden emin değilim.
Martijn Pieters

6

Python 2.7 için

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

Tekerleği yeniden icat etmemeye katılıyorum ama bazen (öğrenirken) bir tekerleği anlamak için bir tekerlek inşa etmenin faydası oluyor. :) Yani, tamamen akademik bir bakış açısıyla, bunu bir sözlük kullanmanın ad-değer çiftlerinin benzersiz olduğunu varsaydığı (sorgu dizesinin birden fazla kayıt içermediği) uyarısıyla sunuyorum.

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

Idle IDE'de 3.6.5 sürümünü kullanıyorum.


0

Çünkü url sorgusunu dikte etmek python2.7için urlparsemodül kullanıyorum .

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

Sadece öğeyi kaldırarak orijinal url'yi yeniden oluşturmamanın bir yolu var mı?
John Constantine
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.