फेंकता यूआरआई सांकेतिक शब्दों में बदलना करने के लिए मैं urllib.quote("schönefeld")
इस्तेमाल किया, लेकिन जब कुछ गैर- ASCII वर्ण स्ट्रिंग में मौजूद है, यह thorwsurllib.quote(), KeyError
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
मेरे इनपुट तार कर रहे हैं köln, brønshøj, schönefeld
आदि
जब मैंने विंडोज़ में केवल प्रिंटिंग कथन की कोशिश की (पायथन 2.7, पिस्क्रिप्टर आईडीई का उपयोग करना)। लेकिन लिनक्स में यह अपवाद उठाता है (मुझे लगता है कि मंच कोई फर्क नहीं पड़ता)।
यह मैं क्या कोशिश कर रहा हूँ है:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
मुद्दा कारण तलाश:urllib.quote()
में , वास्तव में अपवाद return ''.join(map(quoter, s))
पर throwin जा रहा है।
कोड urllib में है:
def quote(s, safe='/'):
if not s:
if s is None:
raise TypeError('None object cannot be quoted')
return s
cachekey = (safe, always_safe)
try:
(quoter, safe) = _safe_quoters[cachekey]
except KeyError:
safe_map = _safe_map.copy()
safe_map.update([(c, c) for c in safe])
quoter = safe_map.__getitem__
safe = always_safe + safe
_safe_quoters[cachekey] = (quoter, safe)
if not s.rstrip(safe):
return s
return ''.join(map(quoter, s))
अपवाद के लिए कारण, ''.join(map(quoter, s))
में है रों में प्रत्येक तत्व के लिए, quoter फ़ंक्शन कॉल किया जाएगा और अंत में सूची 'से' में शामिल हुए किया जाएगा और लौट आए।
गैर-असीसी चार è
के लिए, समकक्ष कुंजी %E8
होगी जो _safe_map
चर में प्रस्तुत होती है। लेकिन जब मैं उद्धरण ('è') कह रहा हूं, तो यह कुंजी \xe8
की खोज करता है। ताकि कुंजी मौजूद न हो और अपवाद फेंक दिया जाए।
तो, मैंने पर कॉल करने से पहले s = [el.upper().replace("\\X","%") for el in s]
को संशोधित करने से पहले संशोधित किया। अब यह ठीक काम करता है।
लेकिन मुझे परेशान है कि मैंने जो किया है वह सही दृष्टिकोण है या यह कोई अन्य मुद्दा पैदा करेगा? और मेरे पास लिनक्स के 200+ उदाहरण भी हैं जो सभी मामलों में इस फिक्स को तैनात करना बहुत कठिन है।
क्या यह पायथन 2 यूनिकोड मानों के साथ है? यह पहले से ही एन्कोडेड डेटा के लिए ठीक काम करता है। –
आप 'urllib.quote ('sch \ xe9nefeld') के लिए त्रुटि प्राप्त नहीं करते हैं। आप * केवल * urllib.quote (u'sch \ xe9nefeld ') के लिए त्रुटि प्राप्त करें ('' '' यूनिकोड अक्षरशः नोट करें)। –
@MartijnPieters तो 'cmdString = "http: // baseurl" + उद्धरण ("schönefeld")' यह 'cmdString = u" http: // baseurl "+ quote (u" schönefeld ") जैसा होना चाहिए? – Garfield