2012-05-26 16 views
6

का उपयोग कर क्वेरी स्ट्रिंग बनाएं, मैं एक यूआरएल बनाने की कोशिश कर रहा हूं ताकि मैं urllib मॉड्यूल का उपयोग करके इसे प्राप्त कर सकूं।urlencode python

>>> initial_url = "http://www.stackoverflow.com" 
>>> search = "Generate+value" 
>>> params = {"data":initial_url,"search":search} 
>>> query_string = urllib.urlencode(params) 
>>> query_string 
'search=Generate%2Bvalue&data=http%3A%2F%2Fwww.stackoverflow.com' 

अब अगर आप मेरी query_stringfinal_url आप कर सकते हैं पर्यवेक्षक दो चीजों के प्रारूप के साथ तुलना करें:

मेरी final_url होना चाहिए

url = "www.example.com/find.php?data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value" 

अब मैं निम्नलिखित तरीके से करने की कोशिश की इस लक्ष्य को हासिल करने के लिए मान लें चलो

1) पैरामीटर का क्रम data=()&search= के बजाय उलट दिया गया है यह 012 है

2) urlencode भी Generate+value

में + इनकोडिंग मेरा मानना ​​है कि पहला परिवर्तन शब्दकोश के यादृच्छिक व्यवहार के कारण है। तो, मैं OrderedDict to reverse the dictionary का उपयोग करने के बावजूद। के रूप में, मैं python 2.6.5 उपयोग कर रहा हूँ मैं

pip install ordereddict 

किया लेकिन मैं अपने कोड में उपयोग करने में सक्षम है जब मैं

>>> od = OrderedDict((('a', 'first'), ('b', 'second'))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'OrderedDict' is not defined 

कोशिश नहीं कर रहा हूँ तो, मेरे सवाल में OrderedDict उपयोग करने के लिए सही तरीका क्या है क्या है पायथन 2.6.5 और मैं urlencode में + को कैसे अनदेखा कर सकता हूं।

इसके अलावा, URL बनाने के लिए यह सही दृष्टिकोण है।

उत्तर

15

आपको + एन्कोडिंग के बारे में चिंता नहीं करना चाहिए, इसे यूआरएल से अनदेखा करने के बाद सर्वर पर बहाल किया जाना चाहिए। नामित पैरामीटर के आदेश से कोई फर्क नहीं पड़ता।

को ध्यान में रखते OrderedDict, ऐसा नहीं है पायथन में निर्मित आप इसे collections से आयात करना चाहिए:।

from urllib import urlencode, quote 
# from urllib.parse import urlencode # python3 
from collections import OrderedDict 

initial_url = "http://www.stackoverflow.com" 
search = "Generate+value" 
query_string = urlencode(OrderedDict(data=initial_url,search=search)) 

अगर आपके अजगर बहुत पुराना है और मॉड्यूल collections में OrderedDict नहीं है, उपयोग करें:

encoded = "&".join("%s=%s" % (key, quote(parameters[key], safe="+")) 
    for key in ordered(parameters.keys())) 

वैसे भी, पैरामीटर के आदेश से कोई फर्क नहीं पड़ता।

quote के safe पैरामीटर पर ध्यान दें। यह बचने के लिए + को रोकता है, लेकिन इसका मतलब है, सर्वर Generate+value को Generate value के रूप में व्याख्या करेगा।

+0

मैंने 'संग्रह आयात ऑर्डर्ड डिक्ट' से कोशिश की लेकिन अब मुझे 'आयात त्रुटि: नाम ऑर्डर्ड डिक्ट' आयात नहीं हो रहा है। मैं पाइथन '2.6.5' – RanRag

+0

का उपयोग कर रहा हूं यह पैटन 2.4 से उपलब्ध होना चाहिए। यदि आप 'आयात संग्रह' निष्पादित करते हैं तो आपको क्या मिलता है? –

+0

मैं सफलतापूर्वक संग्रह आयात कर सकता हूं कोई त्रुटि फेंक दी गई है। हालांकि, 'ऑर्डर्ड डिक्ट' को अजगर 2.7 के बाद से पेश किया गया था। – RanRag

3

सबसे पहले, एक http अनुरोध में मापदंडों का आदेश पूरी तरह से अप्रासंगिक होना चाहिए: आप मैन्युअल %2B लेखन और % के रूप में सुरक्षित चार चिह्नित करके + बच सकते हैं। यदि ऐसा नहीं है तो दूसरी ओर पार्सिंग लाइब्रेरी कुछ गलत कर रही है।

दूसरा, निश्चित रूप से + एन्कोड किया गया है। + को एन्कोडेड यूआरएल में किसी स्थान के लिए प्लेसहोल्डर के रूप में उपयोग किया जाता है, इसलिए यदि आपके कच्चे स्ट्रिंग में + है, तो इसे बचाना होगा।urlencode एक अनएन्कोडेड स्ट्रिंग की अपेक्षा करता है, आप इसे पहले से एन्कोड किए गए स्ट्रिंग को पास नहीं कर सकते हैं।

+0

धन्यवाद आप सही हैं। मैंने अपनी गलती पूछने से पहले जांच नहीं की थी। – RanRag

0

सवाल और अन्य जवाब पर कुछ टिप्पणियां:

  1. आप urllib.urlencode साथ क्रम बनाए रखने चाहते हैं, मानचित्रण (dict) के बजाय कश्मीर/v जोड़े का एक आदेश दिया अनुक्रम सबमिट करें। जब आप एक ताना में गुजरते हैं, urlencode एक पुनरावृत्ति अनुक्रम को पकड़ने के लिए बस foo.items() पर कॉल करता है।

# urllib.urlencode accepts a mapping or sequence # the output of this can vary, because `items()` is called on the dict urllib.urlencode({"data": initial_url,"search": search}) # the output of this will not vary urllib.urlencode((("data", initial_url), ("search", search)))

आप भी एक secondard doseq कैसे iterable मूल्यों नियंत्रित किया जाता है समायोजित करने के लिए तर्क में पारित कर सकते हैं।

  1. पैरामीटर का क्रम अप्रासंगिक नहीं है। उदाहरण के लिए इन दो यूआरएल ले:

    https://example.com?foo=bar&bar=foo https://example.com?bar=foo&foo=bar

    कोई http सर्वर इन मानकों अप्रासंगिक के आदेश पर विचार करना चाहिए, लेकिन एक समारोह तुलना करने के लिए यूआरएल नहीं होगा बनाया गया है। यूआरएल की सुरक्षित रूप से तुलना करने के लिए, इन पैरा को क्रमबद्ध करने की आवश्यकता होगी।

    हालांकि, डुप्लिकेट चाबी पर विचार करें:

    https://example.com?foo=3&foo=2&foo=1

यूआरआई चश्मा डुप्लिकेट चाबी का समर्थन है, लेकिन पूर्वता या आदेश का पता नहीं।

किसी दिए गए आवेदन में, इन प्रत्येक अलग परिणाम को गति प्रदान और साथ ही मान्य हो सकता है:

https://example.com?foo=1&foo=2&foo=3 
https://example.com?foo=1&foo=3&foo=2 
https://example.com?foo=2&foo=3&foo=1 
https://example.com?foo=2&foo=1&foo=3 
https://example.com?foo=3&foo=1&foo=2 
https://example.com?foo=3&foo=2&foo=1 
  1. + आरक्षित वर्ण है कि के भाग के लिए एक urlencoded रूप में एक स्थान (बनाम %20 का प्रतिनिधित्व करता है राह)। urllib.urlencodeurllib.quote_plus() का उपयोग करके बच निकला, urllib.quote() नहीं। ओपी सबसे अधिक संभावना सिर्फ इस करना चाहता था:

initial_url = "http://www.stackoverflow.com" search = "Generate value" urllib.urlencode((("data", initial_url), ("search", search)))

कौन सा पैदा करता है:

data=http%3A%2F%2Fwww.stackoverflow.com&search=Generate+value

आउटपुट के रूप में