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.