Per codificare l'URI, ho usato urllib.quote("schönefeld")
ma quando alcuni caratteri non ASCII esiste in stringa, thorwsurllib.quote() genera KeyError
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
mie stringhe di input sono köln, brønshøj, schönefeld
ecc
Quando Ho provato a stampare le istruzioni in Windows (usando python2.7, IDP di pyscripter). Ma in Linux solleva un'eccezione (suppongo che la piattaforma non abbia importanza).
Questo è quello che sto cercando:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
Esplorando la ragione problema: in urllib.quote()
, in realtà eccezion throwin a return ''.join(map(quoter, s))
.
Il codice in 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))
La ragione di eccezione è in ''.join(map(quoter, s))
, per ogni elemento in s, la funzione quoter sarà chiamata e, infine, la lista sarà affiancato da '' ed è tornato.
Per il carattere non ascii è
, la chiave equivalente sarà %E8
che si presenta nella variabile _safe_map
. Ma quando chiamo quotazione ('è'), cerca la chiave \xe8
. In modo che la chiave non esiste e generata eccezione.
Quindi, ho appena modificato s = [el.upper().replace("\\X","%") for el in s]
prima di chiamare ''.join(map(quoter, s))
all'interno del blocco try-except. Ora funziona bene.
Ma io sono fastidioso quello che ho fatto è l'approccio corretto o creerà qualsiasi altro problema? E ho anche più di 200 istanze di Linux, che è molto difficile da implementare questa correzione in tutte le istanze.
È questo Python 2 con valori Unicode? Funziona bene per i dati già codificati. –
Non * ottieni * un errore per 'urllib.quote ('sch \ xe9nefeld')'. Tu * solo * ottieni l'errore per 'urllib.quote (u'sch \ xe9nefeld ')' (nota il letterale 'u''' unicode). –
@MartijnPieters quindi 'cmdString =" http: // baseurl "+ quota (" schönefeld ")' questo dovrebbe essere come 'cmdString = u" http: // baseurl "+ quote (u" schönefeld ")'? – Garfield