Bir URL'den parametre alma


164

Aşağıdaki gibi bir URL verildiğinde, sorgu parametrelerinin değerini nasıl ayrıştırabilirim? Örneğin, bu durumda değerini istiyorum def.

/abc?def='ghi'

Çevremde Django kullanıyorum; requestnesnede bana yardımcı olabilecek bir yöntem var mı?

Kullanmayı denedim self.request.get('def')ama ghiumduğum gibi değeri döndürmüyor.

Yanıtlar:


256

Python 2:

import urlparse
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print urlparse.parse_qs(parsed.query)['def']

Python 3:

import urllib.parse as urlparse
from urllib.parse import parse_qs
url = 'http://foo.appspot.com/abc?def=ghi'
parsed = urlparse.urlparse(url)
print(parse_qs(parsed.query)['def'])

parse_qs bir değer listesi döndürür, böylece yukarıdaki kod yazdırılır ['ghi'] .

İşte Python 3 belgeleri.


58
Python3'teimport urllib.parse as urlparse
Ivan De Paz Centeno

26
Not parse_qssana bir liste nesnesi döndürür. Bir dize istiyorsanız ilk elemanını almanız gerekiyorurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
URL'de şu şekilde '#' karakteri bulunuyorsa: foo.appspot.com/#/abc?def=ghi , parçalara izin vermemeniz gerektiğini unutmayın: urlparse(url, allow_fragments=False)aksi takdirde sorgu boş str döndürür.
codezjx

2
python3, kullanmalısınız from urllib.parse import urlparse, parse_qsveparse_qs(parsed.query)
deathemperor

1
@FrancescoFrassinelli geçerlidir. urlparse.urlparse(url)->urlparse(url)
Winand

55

Şok oldum, bu çözüm zaten burada değil. kullanın:

request.GET.get('variable_name')

Bu, değişkeni "GET" sözlüğünden "alır" ve varsa "değişken_adı" değerini veya yoksa hiçbiri nesnesini döndürür.


3
Bu en iyi cevap olmalı. Tıkır tıkır çalışıyor.
muntasir2000

2
Ayrılmak zorunda kaldım self, ancak yukarıdaki yoruma katılıyorum.
Matt Cremeens

Bunu iţletemiyorum. Belki biraz daha ayrıntı. Nasıl talep alıyorsunuz? Bu python3 uyumlu mu?
ggedde

3
@ggedde bu cevap (soru gibi) django için, bir django istek nesnesidir. django kullanmıyorsanız, diğer cevaplardan birini kullanın.
Florian

55
import urlparse
url = 'http://example.com/?q=abc&p=123'
par = urlparse.parse_qs(urlparse.urlparse(url).query)

print par['q'][0], par['p'][0]

46

Python için> 3.4

from urllib import parse
url = 'http://foo.appspot.com/abc?def=ghi'
query_def=parse.parse_qs(parse.urlparse(url).query)['def'][0]

4
IMO yapmanın en iyi yolu. Ekstra pakete ihtiyaç duymaz ve Python 3.5 üzerinde A + çalışır.
wanaryytel

23

Furl adında yeni bir kütüphane var. Bu kütüphaneyi url cebiri için en pitonik buluyorum. Yüklemek:

pip install furl

Kod:

from furl import furl
f = furl("/abc?def='ghi'") 
print f.args['def']

3
Harika kütüphane! Bunu bilmiyordum ama bir cazibe gibi çalışıyor :)
pasql

3
:) Urlparse'ın benim için çalışması için zamanımı harcadım. Daha fazla yok.
Mayank Jaiswal

18

Bunun biraz geç olduğunu biliyorum ama bugün kendimi burada bulduğumdan beri bunun başkaları için faydalı bir cevap olabileceğini düşündüm.

import urlparse
url = 'http://example.com/?q=abc&p=123'
parsed = urlparse.urlparse(url)
params = urlparse.parse_qsl(parsed.query)
for x,y in params:
    print "Parameter = "+x,"Value = "+y

Parse_qsl () ile, "Veriler bir ad listesi, değer çiftleri olarak döndürülür."


5

Başvurduğunuz url bir sorgu türüdür ve istek nesnesinin sorgu bağımsız değişkenlerini almak için arguments adlı bir yöntemi desteklediğini görüyorum . self.request.get('def')Değerinizi doğrudan nesneden almayı da deneyebilirsiniz .


4

Saf Python'da:

def get_param_from_url(url, param_name):
    return [i.split("=")[-1] for i in url.split("?", 1)[-1].split("&") if i.startswith(param_name + "=")][0]

3
def getParams(url):
    params = url.split("?")[1]
    params = params.split('=')
    pairs = zip(params[0::2], params[1::2])
    answer = dict((k,v) for k,v in pairs)

Bu yardımcı olur umarım


Bu bir web uygulamasında gerekli olmamalıdır.
Nick Johnson

3

Urlparse modülü ihtiyacınız olan her şeyi sağlar:

urlparse.parse_qs ()


3

Bunların hiçbirine gerek yok. Sadece

self.request.get('variable_name')

Yöntemi belirtmediğime dikkat edin (GET, POST, vb.). Bu iyi belgelenmiştir ve bu bir örnektir

Django şablonlarını kullanmanız, işleyicinin Django tarafından da işlendiği anlamına gelmez


2
import cgitb
cgitb.enable()

import cgi
print "Content-Type: text/plain;charset=utf-8"
print
form = cgi.FieldStorage()
i = int(form.getvalue('a'))+int(form.getvalue('b'))
print i

0

Btw, ben parse_qs () kullanarak ve boş değer parametreleri alma sorunları yaşıyordu ve hiçbir sorgu içermeyen bir sorgu dizesindeki parametrelerin listesini döndürmek için ikinci bir isteğe bağlı parametre 'keep_blank_values' geçmek zorunda öğrendim. Varsayılan olarak false değerindedir. Bazı bok yazılı API'ler değer içermeseler bile parametrelerin mevcut olmasını gerektirir

for k,v in urlparse.parse_qs(p.query, True).items():
  print k

0

Güzel bir kütüphane var w3lib.url

from w3lib.url import url_query_parameter
url = "/abc?def=ghi"
print url_query_parameter(url, 'def')
ghi

0

parameters = dict (get_parsed_url [4] .split ('&')] bölümü için [part.split ('=')])

Bu basit. Değişken parametreleri tüm parametrelerin bir sözlüğünü içerir.


0

Tornado kullanıcıları için bir cevap olmadığını görüyorum:

key = self.request.query_arguments.get("key", None)

Bu yöntem, aşağıdakilerden türetilen bir işleyici içinde çalışmalıdır:

tornado.web.RequestHandler

Hiçbiri, istenen anahtar bulunamadığında bu yöntemin döndüreceği yanıttır. Bu size bazı istisna işlemleri kazandırır.

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.