atar ben urllib.quote("schönefeld")
kullanılan ancak bazı ASCII olmayan karakterler dizesi var, bunun My giriş dizeleriurllib.quote(), URI kodlamak için KeyError
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
thorws vb köln, brønshøj, schönefeld
zaman Pencerelerde yalnızca baskı ifadelerini denedim (python2.7, pyscripter IDE kullanarak). Ancak linux'da istisna kaldırıyor (sanırım platform önemli değil).
Bu benim çalışıyorum budur:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
sorunu nedeni keşfetmek: urllib.quote()
yılında, aslında istisna return ''.join(map(quoter, s))
de throwin ediliyor. urllib içinde
kodudur: istisna için
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))
nedeni, ''.join(map(quoter, s))
olduğu s her eleman için, teklif sahibi işlevi çağrılır ve son olarak liste 'de katılacak ve geri döndü.
Ascii char için è
, eşdeğer anahtar _safe_map
değişkeninde bulunan %E8
olacaktır. Ama ben alıntı ('è') çağırdığımda, \xe8
anahtarını arar. Böylece anahtar mevcut değil ve istisna atıldı.
Yani, try-except bloğu içinde ''.join(map(quoter, s))
'u aramadan önce s = [el.upper().replace("\\X","%") for el in s]
'u değiştirdim. Şimdi iyi çalışıyor.
Ama ne yaptığımı can sıkıcı bir yaklaşım mıyım yoksa başka bir sorun yaratacaktır? Ayrıca, bu düzeltmeyi tüm durumlarda dağıtmak çok zor olan 200'den fazla linux örneğim var.
Bu Python 2 unicode değerleri ile mi? Zaten kodlanmış veriler için iyi çalışıyor. –
Yapmanız gereken bir şey değil, * urllib.quote ('sch \ xe9nefeld') '. * Sadece * urllib.quote (u'sch \ xe9nefeld ') '(' u '' unicode literal) not alın. –
@MartijnPieters bu yüzden cmdString = "http: // baseurl" + quote ("schönefeld") 'bu cmdString = u" http: // baseurl "+ quote (u" schönefeld ")' gibi olmalıdır? – Garfield