Zamień znaki specjalne w ciągu za pomocą znaku ucieczki% xx. Litery, cyfry i znaki „_.-” nigdy nie są cytowane. Domyślnie ta funkcja służy do cytowania sekcji ścieżki adresu URL. Opcjonalny bezpieczny parametr określa dodatkowe znaki, które nie powinny być cytowane - jego wartość domyślna to „/”
Oznacza to, że podanie „dla bezpieczeństwa” rozwiąże Twój pierwszy problem:
O drugiej kwestii, istnieje raport o błędzie o tym tutaj . Najwyraźniej zostało to naprawione w Pythonie 3. Możesz to obejść, kodując jako utf8 w następujący sposób:
Dzięki wam oboje działali świetnie. urlencode po prostu wywołuje wielokrotnie quoteplus w pętli, co nie jest prawidłową normalizacją dla mojego zadania (oauth).
Paul Tarjan
6
specyfikacja: rfc 2396 definiuje je jako zastrzeżone. Z reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","tym ma do czynienia urllib.quote.
Jeff Sheffield,
63
urllib.quoteprzeniósł się do urlib.parse.quote, ponieważ Python3.
Ponadto, w przypadku kodowania zapytania wyszukiwania, lepiej użyć quote_plus: docs.python.org/3/library/… 1. Domyślnie koduje ukośniki 2. Koduje również spacje
Nazwa quotejest raczej ogólnikowa. To może być ładniejszy użyć czegoś jak urlencode: from urllib.parse import quote as urlencode.
Luc
Należy pamiętać, że jest to funkcja o nazwie urlencodew urllib.parsejuż, że robi coś zupełnie innego, więc byłbyś lepiej wybierając inną nazwę lub ryzyko poważnie mylące przyszłych czytelników kodzie.
jaymmer - Przywróć Monikę
48
Moja odpowiedź jest podobna do odpowiedzi Paolo.
Myślę, że moduł requestsjest znacznie lepszy. Opiera się na urllib3. Możesz spróbować:
Zauważ, że zmiany w Pythonie od czasu opublikowania tej odpowiedzi oznaczają, że jest to teraz starsze opakowanie. Z kodu źródłowego Django 2.1 dla django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Lepiej jest użyć urlencodetutaj. Niewielka różnica dla pojedynczego parametru, ale IMHO sprawia, że kod jest wyraźniejszy. (Wygląda na mylące, gdy widzę funkcję quote_plus! Szczególnie osoby pochodzące z innych języków)
Odpowiedzi:
Python 2
Z dokumentów :
Oznacza to, że podanie „dla bezpieczeństwa” rozwiąże Twój pierwszy problem:
O drugiej kwestii, istnieje raport o błędzie o tym tutaj . Najwyraźniej zostało to naprawione w Pythonie 3. Możesz to obejść, kodując jako utf8 w następujący sposób:
Przy okazji spójrz na urlencode
Python 3
To samo, z wyjątkiem zastąpienia
urllib.quote
przezurllib.parse.quote
.źródło
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
tym ma do czynienia urllib.quote.urllib.quote
przeniósł się dourlib.parse.quote
, ponieważ Python3.urllib.parse.quote
docsW Pythonie 3
urllib.quote
został przeniesionyurllib.parse.quote
i domyślnie obsługuje Unicode.źródło
quote
jest raczej ogólnikowa. To może być ładniejszy użyć czegoś jak urlencode:from urllib.parse import quote as urlencode
.urlencode
wurllib.parse
już, że robi coś zupełnie innego, więc byłbyś lepiej wybierając inną nazwę lub ryzyko poważnie mylące przyszłych czytelników kodzie.Moja odpowiedź jest podobna do odpowiedzi Paolo.
Myślę, że moduł
requests
jest znacznie lepszy. Opiera się naurllib3
. Możesz spróbować:źródło
requests.utils.quote
to link do Pythonaquote
. Zobacz źródła zapytań .requests.utils.quote
jest cienkim opakowaniem kompatybilnościurllib.quote
dla Pythona 2 iurllib.parse.quote
Pythona 3Jeśli używasz django, możesz użyć urlquote:
Zauważ, że zmiany w Pythonie od czasu opublikowania tej odpowiedzi oznaczają, że jest to teraz starsze opakowanie. Z kodu źródłowego Django 2.1 dla django.utils.http:
źródło
Lepiej jest użyć
urlencode
tutaj. Niewielka różnica dla pojedynczego parametru, ale IMHO sprawia, że kod jest wyraźniejszy. (Wygląda na mylące, gdy widzę funkcjęquote_plus
! Szczególnie osoby pochodzące z innych języków)Dokumenty
urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
quote_plus: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
źródło