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.

niteshb
sumber

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.

systempuntoout
sumber
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.

jball037
sumber
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]
Cris
sumber
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]
Anatoly E
sumber
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']
Mayank Jaiswal
sumber
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."

iCanHasFay
sumber
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 ..

Senthil Kumaran
sumber
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

inspectorG4dget
sumber
Ini tidak perlu di dalam aplikasi web.
Nick Johnson
3

Modul urlparse menyediakan semua yang Anda butuhkan:

urlparse.parse_qs ()

Andreas Jung
sumber
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

chachan
sumber
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]
Asym
sumber
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
George
sumber
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
Sciweb
sumber
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
Corvax
sumber
0

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

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

Mayuresh Satao
sumber
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.

Oren_C
sumber