Mengambil parameter dari URL


164

Dengan URL seperti berikut ini, bagaimana saya bisa menguraikan nilai parameter kueri? Misalnya, dalam hal ini saya ingin nilai def.

/abc?def='ghi'

Saya menggunakan Django di lingkungan saya; apakah ada metode pada requestobjek yang dapat membantu saya?

Saya mencoba menggunakan self.request.get('def')tetapi tidak mengembalikan nilai ghiseperti yang saya harapkan.

Jawaban:


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_qsmengembalikan daftar nilai, sehingga kode di atas akan dicetak ['ghi'].

Berikut dokumentasi Python 3.


58
Dalam python3import urllib.parse as urlparse
Ivan De Paz Centeno

26
Catatan yang parse_qsakan mengembalikan Anda objek daftar. Anda perlu mendapatkan elemen pertama dari itu jika Anda ingin stringurlparse.parse_qs(parsed.query)['def'][0]
raffaem

3
Perhatikan bahwa jika url berisi karakter '#' seperti ini: foo.appspot.com/#/abc?def=ghi , Anda harus melarang fragmen :,urlparse(url, allow_fragments=False) jika tidak, kueri akan mengembalikan str kosong.
codezjx

2
di python3, harus menggunakan from urllib.parse import urlparse, parse_qsdanparse_qs(parsed.query)
deathemperor

1
@FrancescoFrassinelli valid. urlparse.urlparse(url)->urlparse(url)
Menangkan dan

55

Saya terkejut solusi ini belum ada di sini. Menggunakan:

request.GET.get('variable_name')

Ini akan "mendapatkan" variabel dari kamus "GET", dan mengembalikan nilai 'variabel_name' jika ada, atau objek Tidak Ada jika tidak ada.


3
Ini harus menjadi jawaban teratas. Bekerja seperti pesona.
muntasir2000

2
Saya harus pergi self, tetapi saya setuju dengan komentar di atas.
Matt Cremeens

Saya tidak bisa melakukan ini. Mungkin lebih detail. Bagaimana Anda mendapatkan permintaan? Apakah python3 ini kompatibel?
ggedde

3
@ggedde jawaban ini (seperti pertanyaan) adalah untuk Django, itu adalah objek permintaan Django. jika Anda tidak menggunakan Django, gunakan salah satu jawaban lain.
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

untuk Python> 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
Cara terbaik untuk melakukannya IMO. Tidak perlu paket tambahan dan bekerja A + di Python 3.5.
wanaryytel

23

Ada perpustakaan baru bernama furl. Saya menemukan perpustakaan ini paling pythonic untuk melakukan aljabar url. Untuk memasang:

pip install furl

Kode:

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

3
Perpustakaan yang bagus! Tidak tahu tentang itu tetapi bekerja seperti pesona :)
pasql

3
:) Saya telah menyia-nyiakan waktu untuk mencoba membuat urlparse berfungsi untuk saya. Tidak lagi.
Mayank Jaiswal

18

Saya tahu ini agak terlambat tetapi karena saya mendapati diri saya di sini hari ini, saya pikir ini mungkin jawaban yang berguna untuk orang lain.

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

Dengan parse_qsl (), "Data dikembalikan sebagai daftar nama, pasangan nilai."


5

Url yang Anda maksudkan adalah tipe kueri dan saya melihat bahwa objek permintaan mendukung metode yang disebut argumen untuk mendapatkan argumen kueri. Anda mungkin juga ingin mencoba self.request.get('def')secara langsung untuk mendapatkan nilai Anda dari objek ..


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)

Semoga ini membantu


Ini tidak perlu di dalam aplikasi web.
Nick Johnson

3

Modul urlparse menyediakan semua yang Anda butuhkan:

urlparse.parse_qs ()


3

Tidak perlu melakukan semua itu. Hanya dengan

self.request.get('variable_name')

Perhatikan bahwa saya tidak menentukan metode (GET, POST, dll). Ini didokumentasikan dengan baik dan ini adalah contoh

Fakta bahwa Anda menggunakan template Django tidak berarti handler diproses oleh Django juga


3

Dengan Python murni:

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]

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, saya mengalami masalah menggunakan parse_qs () dan mendapatkan parameter nilai kosong dan mengetahui bahwa Anda harus melewati parameter opsional kedua 'keep_blank_values' untuk mengembalikan daftar parameter dalam string kueri yang tidak mengandung nilai. Ini default ke false. Beberapa API tertulis jelek memerlukan parameter untuk hadir bahkan jika mereka tidak mengandung nilai

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

0

Ada perpustakaan yang bagus w3lib.url

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

0

parameter = dict ([part.split ('=') untuk bagian di get_parsed_url [4] .split ('&')])

Yang ini sederhana. Parameter variabel akan berisi kamus semua parameter.


0

Saya melihat tidak ada jawaban untuk pengguna Tornado:

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

Metode ini harus bekerja di dalam penangan yang berasal dari:

tornado.web.RequestHandler

Tidak ada jawaban yang metode ini akan kembali ketika kunci yang diminta tidak dapat ditemukan. Ini menghemat beberapa penanganan pengecualian.

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.