den URI zu kodieren, habe ich urllib.quote("schönefeld")
aber, wenn einige nicht-ASCII-Zeichen in Zeichenfolge vorhanden ist, thorws esurllib.quote() throws KeyError
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
Meine Eingabezeichenfolgen sind köln, brønshøj, schönefeld
usw.
Wenn Ich habe versucht, nur Anweisungen in Windows (mit python2.7, pyscripter IDE) zu drucken. Aber in Linux löst es Ausnahme aus (ich denke Plattform ist nicht wichtig).
Das ist, was ich versuche:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
Explo der Ausgabe Grund: in urllib.quote()
, tatsächlich return ''.join(map(quoter, s))
Ausnahme throwin werden.
Der Code in urllib ist:
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))
Der Grund für die Ausnahme in ''.join(map(quoter, s))
ist, für jedes Element in s, wird quoter Funktion und schließlich die Liste aufgerufen wird, durch '' und wieder zusammengefügt werden.
Für Nicht-ASCII-Zeichen è
ist der äquivalente Schlüssel %E8
, der in _safe_map
Variable darstellt. Aber wenn ich quote ('è') anrufe, sucht es nach dem Schlüssel \xe8
. So dass der Schlüssel nicht existiert und Ausnahme ausgelöst wird.
Also, ich habe nur s = [el.upper().replace("\\X","%") for el in s]
vor dem Aufruf ''.join(map(quoter, s))
innerhalb Try-außer-Block geändert. Jetzt funktioniert es gut.
Aber ich bin ärgerlich, was ich getan habe, ist richtige Vorgehensweise oder es wird jedes andere Problem erstellen? Und ich habe auch mehr als 200 Instanzen von Linux, die sehr schwierig ist, dieses Update in allen Instanzen bereitzustellen.
Ist das Python 2 mit Unicode-Werten? Es funktioniert gut für bereits codierte Daten. –
Sie erhalten * keinen * Fehler für 'urllib.quote ('sch \ xe9nefeld')'. Sie erhalten * nur * den Fehler für 'urllib.quote (u'sch \ xe9nefeld ')' (beachten Sie das 'u''' Unicode-Literal). –
@MartijnPieters so 'cmdString =" http: // baseurl "+ Zitat (" schönefeld ")' das sollte wie sein 'cmdString = u" http: // baseurl "+ Zitat (u" schönefeld ")'? – Garfield