Python को URL क्वेरी पैरामीटर


98

क्या URL (कुछ अजगर लाइब्रेरी के साथ) को पार्स करने का एक तरीका है और URL के भाग के क्वेरी पैरामीटर की कुंजियों और मूल्यों के साथ एक अजगर शब्दकोश लौटाएं?

उदाहरण के लिए:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

अपेक्षित आय:

{'ct':32, 'op':92, 'item':98}

जवाबों:


188

urllib.parseपुस्तकालय का उपयोग करें :

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

urllib.parse.parse_qs()और urllib.parse.parse_qsl()तरीकों की क्वेरी स्ट्रिंग को पार्स आउट ध्यान में रखते हुए कि कुंजी एक बार से अधिक हो सकता है और उस क्रम का कोई प्रभाव हो सकता है।

यदि आप अभी भी अजगर 2 पर हैं, urllib.parseतो बुलाया गया था urlparse


37

पायथन 3 के लिए, से तानाशाह के मूल्य parse_qsएक सूची में हैं, क्योंकि कई मूल्य हो सकते हैं। यदि आप सिर्फ पहला चाहते हैं:

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}

1
यह पायथन 3 के लिए अद्वितीय नहीं है, पायथन 2 urllib.parse_qsभी मूल्यों के लिए सूची देता है। मैं विशेष रूप से मेरे जवाब में इसका उल्लेख करता हूं, वैसे, आप urllib.parse_qsl()इसके बजाय उपयोग करना चाहते हैं और परिणामी सूची को अतीत में रख सकते हैं dict()यदि आप केवल एक मान चाहते हैं।
मार्टिन पीटर्स

अंतर की तरह लगता है के साथ parse_qlsकि क्योंकि यह tuples की एक सूची देता है, परिवर्तित है कि एक dict को रखेंगे पिछले के बजाय मूल्य पहले । इस पाठ्यक्रम के साथ शुरू करने के लिए कई मान थे।
रेबैनो

11

यदि आप पार्सर का उपयोग नहीं करना चाहते हैं:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

तो मैं ऊपर क्या है हटा नहीं होगा, लेकिन यह निश्चित रूप से नहीं है जो आपको उपयोग करना चाहिए।

मुझे लगता है कि मैंने कुछ उत्तर पढ़े और वे थोड़े जटिल लग रहे थे, मान लें कि आप मेरे जैसे हैं, मेरे समाधान का उपयोग न करें।

इसे इस्तेमाल करो:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

और पायथन 2.X के लिए

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

मुझे पता है कि यह स्वीकृत उत्तर के समान है, बस एक लाइनर में जिसे कॉपी किया जा सकता है।


6
पार्सिंग में केवल स्ट्रिंग को विभाजित करने से अधिक शामिल है। आपको URL एन्कोडिंग (सहित +) को संभालने की आवश्यकता है , और urllib.parseआपके अनुरोध के अनुसार त्रुटियों को भी उठाता है या अनदेखा करता है। मुझे यकीन नहीं है कि जब आप मानक पुस्तकालय का हिस्सा होते हैं तो आप इस पहिए को फिर से क्यों बनाना चाहते हैं।
मार्टिन पीटर्स

6

अजगर 2.7 के लिए

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}

4

मैं पहिया को सुदृढ़ नहीं करने के बारे में सहमत हूं लेकिन कभी-कभी (जब आप सीख रहे होते हैं) यह पहिया को समझने के लिए एक पहिया बनाने में मदद करता है। :) तो, एक विशुद्ध रूप से शैक्षणिक दृष्टिकोण से, मैं यह चेतावनी के साथ प्रदान करता हूं कि डिक्शनरी का उपयोग करके मान लिया जाता है कि नाम के जोड़े अद्वितीय हैं (क्वेरी स्ट्रिंग में कई रिकॉर्ड नहीं हैं)।

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

मैं आईडीएल आईडीई में संस्करण 3.6.5 का उपयोग कर रहा हूं।


0

के लिए python2.7मैं urlparseमॉड्यूल का उपयोग कर रहा हूँ उर क्वेरी क्वेरी को ताना।

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.