2015-02-04 11 views
8

से यूआरएल पैरामीटर निकालें I python 2 & 3 संगतता बनाए रखने और मेरे एप्लिकेशन अनुरोध प्रबंधन को सरल बनाने के लिए requests नामक इस भयानक लाइब्रेरी का उपयोग कर रहा हूं।पायथन-अनुरोध, स्ट्रिंग

मेरे पास ऐसा कोई मामला है जहां मुझे एक यूआरएल पार्स करने और इसके पैरामीटर को प्रतिस्थापित करने की आवश्यकता है। उदाहरण के लिए:

http://example.com?param1=a&token=TOKEN_TO_REPLACE&param2=c 

और मैं इस प्राप्त करना चाहते हैं:

from urllib.parse import urlparse 
from urllib.parse import parse_qs 
from urllib.parse import urlencode 

url = 'http://example.com?param1=a&token=TOKEN_TO_REPLACE&param2=c' 

o = urlparse(url) 
query = parse_qs(o.query) 
if query.get('token'): 
    query['token'] = ['NEW_TOKEN', ] 
    new_query = urlencode(query, doseq=True) 
    url.split('?')[0] + '?' + new_query 

>>> http://example.com?param2=c&param1=a&token=NEW_TOKEN 

आप requests लाइब्रेरी का उपयोग कर एक ही कैसे प्राप्त कर सकते हैं:

http://example.com?param1=a&token=NEW_TOKEN&param2=c 

urllib के साथ मैं इसे इस तरह प्राप्त कर सकते हैं ?

उत्तर

26

आप इसके लिए requests का उपयोग नहीं कर सकते हैं; लाइब्रेरी पैरामीटर के लिए पाइथन संरचना उत्तीर्ण होने पर ऐसे यूआरएल बनाता है, लेकिन उन्हें पार्स करने के लिए किसी भी उपकरण की पेशकश नहीं करता है। यह परियोजना का लक्ष्य नहीं है।

पैरामीटर को पार्स करने के लिए urllib.parse विधि पर चिपकाएं। एक बार जब आप एक शब्दकोश या की-वैल्यू tuples की सूची है, बस requests को पारित उस URL को फिर से निर्माण करने के लिए:

try: 
    # Python 3 
    from urllib.parse import urlparse, parse_qs 
except ImportError: 
    # Python 2 
    from urlparse import urlparse, parse_qs 

o = urlparse(url) 
query = parse_qs(o.query) 
# extract the URL without query parameters 
url = o._replace(query=None).geturl() 

if 'token' in query: 
    query['token'] = 'NEW_TOKEN' 

requests.get(url, params=query) 

आप दोनों अजगर 2 और 3 में दोनों urlparse और parse_qs कार्यों प्राप्त कर सकते हैं, आप सभी की जरूरत यदि आप अपवाद प्राप्त करते हैं तो आयात स्थान समायोजित करना है। अजगर 3 पर

डेमो (आयात अपवाद गार्ड के बिना) यूआरएल प्रदर्शित करने के लिए बनाया गया है:

>>> from urllib.parse import urlparse, parse_qs 
>>> url = "http://httpbin.org/get?token=TOKEN_TO_REPLACE&param2=c" 
>>> o = urlparse(url) 
>>> query = parse_qs(o.query) 
>>> url = o._replace(query=None).geturl() 
>>> if 'token' in query: 
...  query['token'] = 'NEW_TOKEN' 
... 
>>> response = requests.get(url, params=query) 
>>> print(response.text) 
{ 
    "args": { 
    "param2": "c", 
    "token": "NEW_TOKEN" 
    }, 
    "headers": { 
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.5.1 CPython/3.4.2 Darwin/14.1.0" 
    }, 
    "origin": "188.29.165.245", 
    "url": "http://httpbin.org/get?token=NEW_TOKEN&param2=c" 
} 
+0

मैं अजगर 2 और 3 – Gab

+0

@Gab के बीच आसान अनुकूलता के लिए अनुरोध का उपयोग करना चाहते: लेकिन 'requests' उस कार्यक्षमता की पेशकश नहीं करता है। –

+0

@ गैब: मैंने यह स्पष्ट करने के लिए पोस्ट को अपडेट किया है कि आप पाइथन 2 और 3 के बीच संगतता कैसे बनाए रख सकते हैं; समान कार्यक्षमता दोनों संस्करणों में मौजूद है, बस अलग-अलग स्थानों में। 'अनुरोध' वहां मदद नहीं कर सकता है। –

संबंधित मुद्दे