Ganti karakter khusus dalam string menggunakan% xx escape. Huruf, angka, dan karakter '_.-' tidak pernah dikutip. Secara default, fungsi ini dimaksudkan untuk mengutip bagian jalur URL. Parameter aman opsional menentukan karakter tambahan yang tidak boleh dikutip - nilai defaultnya adalah '/'
Itu berarti melewati '' untuk aman akan menyelesaikan masalah pertama Anda:
Tentang masalah kedua, ada laporan bug di sini . Rupanya itu diperbaiki dalam python 3. Anda dapat mengatasinya dengan pengkodean sebagai utf8 seperti ini:
Terima kasih, keduanya bekerja dengan baik. urlencode hanya memanggil quoteplus berkali-kali dalam satu lingkaran, yang bukan merupakan normalisasi yang benar untuk tugas saya (oauth).
Paul Tarjan
6
spec: rfc 2396 mendefinisikan ini sebagai cadangan. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","Inilah yang berurusan dengan urllib.quote.
Jeff Sheffield
63
urllib.quotedipindahkan ke urlib.parse.quote, sejak Python3.
Juga, dalam hal menyandikan kueri pencarian, Anda mungkin lebih baik menggunakan quote_plus: docs.python.org/3/library/… 1. Ini menyandikan garis miring secara default 2. Juga menyandikan spasi
Nama quoteitu agak kabur sebagai global. Mungkin lebih baik untuk menggunakan sesuatu seperti urlencode: from urllib.parse import quote as urlencode.
Luc
Perhatikan bahwa ada fungsi yang sudah ada urlencodedi dalam urllib.parseyang melakukan sesuatu yang sama sekali berbeda, jadi sebaiknya Anda memilih nama lain atau berisiko serius membingungkan pembaca kode Anda di masa mendatang.
jaymmer
48
Jawaban saya mirip dengan jawaban Paolo.
Saya pikir modul requestsjauh lebih baik. Ini berdasarkan urllib3. Anda dapat mencoba ini:
Perhatikan bahwa perubahan pada Python sejak jawaban ini dipublikasikan berarti bahwa ini sekarang adalah pembungkus warisan. Dari kode sumber Django 2.1 untuk django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
Lebih baik digunakan di urlencodesini. Tidak banyak perbedaan untuk parameter tunggal tetapi IMHO membuat kode lebih jelas. (Sepertinya membingungkan melihat fungsi quote_plus! Terutama yang berasal dari negara lain)
Jawaban:
Python 2
Dari dokumen :
Itu berarti melewati '' untuk aman akan menyelesaikan masalah pertama Anda:
Tentang masalah kedua, ada laporan bug di sini . Rupanya itu diperbaiki dalam python 3. Anda dapat mengatasinya dengan pengkodean sebagai utf8 seperti ini:
Omong-omong lihat urlencode
Python 3
Sama, kecuali ganti
urllib.quote
denganurllib.parse.quote
.sumber
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Inilah yang berurusan dengan urllib.quote.urllib.quote
dipindahkan keurlib.parse.quote
, sejak Python3.urllib.parse.quote
docsDalam Python 3,
urllib.quote
telah dipindahkan keurllib.parse.quote
dan menangani unicode secara default.sumber
quote
itu agak kabur sebagai global. Mungkin lebih baik untuk menggunakan sesuatu seperti urlencode:from urllib.parse import quote as urlencode
.urlencode
di dalamurllib.parse
yang melakukan sesuatu yang sama sekali berbeda, jadi sebaiknya Anda memilih nama lain atau berisiko serius membingungkan pembaca kode Anda di masa mendatang.Jawaban saya mirip dengan jawaban Paolo.
Saya pikir modul
requests
jauh lebih baik. Ini berdasarkanurllib3
. Anda dapat mencoba ini:sumber
requests.utils.quote
adalah tautan ke pythonquote
. Lihat sumber permintaan .requests.utils.quote
adalah pembungkus kompatibilitas tipis untukurllib.quote
untuk python 2 danurllib.parse.quote
untuk python 3Jika Anda menggunakan Django, Anda dapat menggunakan urlquote:
Perhatikan bahwa perubahan pada Python sejak jawaban ini dipublikasikan berarti bahwa ini sekarang adalah pembungkus warisan. Dari kode sumber Django 2.1 untuk django.utils.http:
sumber
Lebih baik digunakan di
urlencode
sini. Tidak banyak perbedaan untuk parameter tunggal tetapi IMHO membuat kode lebih jelas. (Sepertinya membingungkan melihat fungsiquote_plus
! Terutama yang berasal dari negara lain)Documents
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
sumber