Để mã hóa URI, tôi sử dụng urllib.quote("schönefeld")
nhưng khi một số ký tự khác ASCII tồn tại trong chuỗi, nó thorwsurllib.quote() throws KeyError
KeyError: u'\xe9'
Code: return ''.join(map(quoter, s))
chuỗi đầu vào của tôi là köln, brønshøj, schönefeld
, vv
Khi Tôi đã cố gắng chỉ in báo cáo trong cửa sổ (Sử dụng python2.7, pyscripter IDE). Nhưng trong linux nó làm tăng ngoại lệ (tôi đoán nền tảng không quan trọng).
Đây là những gì tôi đang cố gắng:
from commands import getstatusoutput
queryParams = "schönefeld";
cmdString = "http://baseurl" + quote(queryParams)
print getstatusoutput(cmdString)
Khám phá lý do vấn đề: trong urllib.quote()
, thực sự ngoại lệ được throwin tại return ''.join(map(quoter, s))
.
Mã trong urllib là:
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))
Lý do là ngoại lệ trong ''.join(map(quoter, s))
, cho mỗi phần tử trong s, chức năng quoter sẽ được gọi và cuối cùng danh sách sẽ được tham gia bởi '' và trả về.
Đối với thẻ không phải là ascii char è
, khóa tương đương sẽ là %E8
có trong biến số _safe_map
. Nhưng khi tôi gọi báo giá ('è'), nó tìm kiếm khóa \xe8
. Vì vậy, chìa khóa không tồn tại và ngoại lệ ném.
Vì vậy, tôi vừa sửa đổi s = [el.upper().replace("\\X","%") for el in s]
trước khi gọi số ''.join(map(quoter, s))
trong khối try-except. Bây giờ nó hoạt động tốt.
Nhưng tôi làm phiền những gì tôi đã làm là cách tiếp cận chính xác hoặc nó sẽ tạo ra bất kỳ vấn đề nào khác? Và tôi cũng có hơn 200 trường hợp của Linux, điều này rất khó triển khai bản sửa lỗi này trong mọi trường hợp.
Đây có phải là Python 2 với các giá trị unicode không? Nó hoạt động tốt cho dữ liệu đã được mã hóa. –
Bạn * không * nhận được lỗi cho 'urllib.quote ('sch \ xe9nefeld')'. Bạn * chỉ * nhận được lỗi cho 'urllib.quote (u'sch \ xe9nefeld ')' (lưu ý 'u''' unicode literal). –
@MartijnPieters vì vậy 'cmdString =" http: // baseurl "+ trích dẫn (" schönefeld ")' điều này phải giống như 'cmdString = u" http: // baseurl "+ trích dẫn (u" schönefeld ")'? – Garfield