किसी URL से पैरामीटर पुनर्प्राप्त करना


164

निम्नलिखित जैसे URL को देखते हुए, मैं क्वेरी मापदंडों के मूल्य को कैसे पार्स कर सकता हूं? उदाहरण के लिए, इस मामले में मुझे मूल्य चाहिए def

/abc?def='ghi'

मैं अपने वातावरण में Django का उपयोग कर रहा हूं; क्या कोई ऐसी requestवस्तु है जो मेरी मदद कर सके?

मैंने उपयोग करने की कोशिश की self.request.get('def')लेकिन यह ghiवैसा मूल्य नहीं लौटा रहा है जैसा कि मुझे उम्मीद थी।

जवाबों:


255

अजगर 2:

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

अजगर 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मानों की सूची लौटाता है, इसलिए उपरोक्त कोड प्रिंट होगा ['ghi']

यहाँ पायथन 3 प्रलेखन है।


58
Python3 मेंimport urllib.parse as urlparse
इवान डी पाज़ सेंटेनो

26
ध्यान दें कि parse_qsआप एक सूची वस्तु वापस करेंगे। यदि आप एक स्ट्रिंग चाहते हैं तो आपको इसका पहला तत्व प्राप्त करना होगाurlparse.parse_qs(parsed.query)['def'][0]
राफेल

3
ध्यान दें कि यदि url में '#' वर्ण इस प्रकार है: foo.appspot.com/#/abc?def=ghi , तो आपको अंशों को अस्वीकार करना होगा: urlparse(url, allow_fragments=False)अन्यथा क्वेरी खाली str पर वापस आ जाएगी।
codezjx

2
python3 में, का उपयोग करना चाहिए from urllib.parse import urlparse, parse_qsऔरparse_qs(parsed.query)
deathem King

1
@FrancescoFrassinelli यह मान्य है। urlparse.urlparse(url)->urlparse(url)
Winand

55

मैं हैरान हूँ कि यह समाधान यहाँ पहले से ही नहीं है। उपयोग:

request.GET.get('variable_name')

यह "GET" डिक्शनरी से वैरिएबल को "प्राप्त" करेगा, और यदि मौजूद नहीं है तो 'वेरिएबल_नाम' मान लौटाएगा या यदि यह मौजूद नहीं है तो कोई भी वस्तु नहीं।


3
यह शीर्ष उत्तर होना चाहिए। एक जादू की तरह काम करता है।
muntasir2000

2
मुझे छोड़ना पड़ा self, लेकिन मैं उपरोक्त टिप्पणी से सहमत हूं।
मैट क्रीमेंस

मैं यह काम करने के लिए नहीं मिल सकता। शायद कुछ और जानकारी। आपको कैसे निवेदन मिल रहा है? क्या यह अजगर 3 संगत है?
२०:५० पर गेड्डे

3
@ इस जवाब को (प्रश्न की तरह) django के लिए है, यह django request ऑब्जेक्ट है। यदि आप django का उपयोग नहीं कर रहे हैं, तो अन्य उत्तरों में से किसी एक का उपयोग करें।
फ्लोरियन

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

पायथन के लिए> 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 है। अतिरिक्त पैकेज की जरूरत नहीं है और पायथन 3.5 पर ए + काम करता है।
wanaryytel

23

एक नया पुस्तकालय है जिसे फ़र्ल कहा जाता है। मैं इस पुस्तकालय को url बीजगणित करने के लिए सबसे अधिक पायथोनिक मानता हूं। स्थापित करने के लिए:

pip install furl

कोड:

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

3
महान पुस्तकालय! इसके बारे में पता नहीं था, लेकिन एक आकर्षण की तरह काम करता है :)
pasql

3
:) मैंने अपना कुछ समय बर्बाद कर दिया है ताकि मेरे लिए काम करने की कोशिश की जा सके। अब और नहीं।
मयंक जायसवाल

18

मुझे पता है कि यह थोड़ा देर से है लेकिन जब से मैंने आज यहां खुद को पाया, मैंने सोचा कि यह दूसरों के लिए एक उपयोगी उत्तर हो सकता है।

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 () के साथ, "डेटा को नाम, मूल्य जोड़े की सूची के रूप में लौटाया जाता है।"


5

आपके द्वारा उल्लिखित url एक क्वेरी प्रकार है और मैं देखता हूं कि अनुरोध ऑब्जेक्ट क्वेरी तर्कों को प्राप्त करने के लिए तर्कों नामक एक विधि का समर्थन करता है । आप self.request.get('def')वस्तु से अपना मूल्य प्राप्त करने के लिए सीधे प्रयास भी कर सकते हैं ।


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)

उम्मीद है की यह मदद करेगा


यह एक webapp के अंदर आवश्यक नहीं होना चाहिए।
निक जॉनसन


3

इसमें से कुछ भी करने की आवश्यकता नहीं है। सिर्फ साथ

self.request.get('variable_name')

ध्यान दें कि मैं विधि (GET, POST, आदि) निर्दिष्ट नहीं कर रहा हूँ। यह अच्छी तरह से प्रलेखित है और यह एक उदाहरण है

तथ्य यह है कि आप Django टेम्प्लेट का उपयोग करते हैं इसका मतलब यह नहीं है कि हैंडलर को Django द्वारा भी संसाधित किया जाता है


3

शुद्ध अजगर में:

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, मैं parse_qs () का उपयोग करने और रिक्त मान पैरामीटर प्राप्त करने में समस्याएँ आ रहा था और सीखा कि आपको क्वेरी स्ट्रिंग में पैरामीटर की सूची वापस करने के लिए एक दूसरा वैकल्पिक पैरामीटर 'keep_blank_values' पास करना होगा जिसमें कोई मान नहीं हैं। यह असत्य की रक्षा करता है। कुछ भद्दे लिखित API के लिए कोई मान नहीं होने पर भी पैरामीटर की आवश्यकता होती है

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

0

वहाँ एक अच्छा पुस्तकालय w3lib.url है

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

0

पैरामीटर = get_parsed_url [4] .split ('&')] में भाग के लिए निर्धारित ([part.split ('=')]।

यह एक सरल है। चर मापदंडों में सभी मापदंडों का एक शब्दकोश होगा।


0

मैं देख रहा हूँ कि टोरनेडो के उपयोगकर्ताओं के लिए कोई जवाब नहीं है:

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

इस विधि को एक हैंडलर के अंदर काम करना चाहिए जो निम्न से लिया गया है:

tornado.web.RequestHandler

कोई भी जवाब नहीं है जब अनुरोधित कुंजी नहीं मिल सकती है तो यह विधि वापस आ जाएगी। यह आपको कुछ अपवाद हैंडलिंग से बचाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.