Python: Mengimpor urllib.quote

110

Saya ingin menggunakan urllib.quote(). Tapi python (python3) tidak menemukan modulnya. Misalkan, saya memiliki baris kode ini:

print(urllib.quote("châteu", safe=''))

Bagaimana cara mengimpor urllib.quote?

import urllibatau import urllib.quotekeduanya memberi

AttributeError: 'module' object has no attribute 'quote'

Yang membingungkan saya adalah itu urllib.requestdapat diakses melaluiimport urllib.request

imrek
sumber

Jawaban:

180

Di Python 3.x, Anda perlu mengimpor urllib.parse.quote:

>>> import urllib.parse
>>> urllib.parse.quote("châteu", safe='')
'ch%C3%A2teu'

Menurut dokumentasi modul Python 2.xurllib :

CATATAN

The urllibmodul sudah terpecah menjadi bagian-bagian dan nama di Python 3 sampai urllib.request, urllib.parse, dan urllib.error.

falsetru.dll
sumber
54

Jika Anda perlu menangani Python 2.x dan 3.x Anda dapat menangkap pengecualian dan memuat alternatifnya.

try:
    from urllib import quote  # Python 2.X
except ImportError:
    from urllib.parse import quote  # Python 3+

Anda juga bisa menggunakan pembungkus kompatibilitas python enam untuk menangani ini.

from six.moves.urllib.parse import quote
eandersson
sumber
1
Anda harus lebih melihat ke depan. Asumsikan python3 dan kecuali 2.7. coba: impor urllib.parse sebagai urlparse kecuali ImportError: dari urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland
@LincolnRandallMcFarland Apa yang Anda bicarakan adalah optimasi mikro yang tidak relevan. Tidak sulit atau mudah untuk melepaskan dukungan Python 2.X sepenuhnya dalam proyek di masa mendatang.
eandersson
Jika Anda ingin membuat pengecualian sebagai proses impor standar dari kasus penggunaan Anda yang paling umum hanya karena ..., ini bukan siklus dari jam saya tetapi tahu apa yang Anda lakukan: pengecualian harus menjadi pengecualian. Inilah perbedaan antara membuatnya bekerja dan membuatnya lebih baik.
Lincoln Randall McFarland
Ini adalah diskusi yang tidak berarti. Keduanya valid ... jika Anda menangkap pengecualian Python 3 maka coba impor pustaka Python 2.7, tetapi untuk beberapa alasan keduanya kehilangan pengecualian yang dilemparkan akan mengatakan bahwa itu kehilangan pustaka Python 2.7. Sangat membingungkan. Pada kenyataannya, jika Anda sangat peduli tentang pengecualian, ada cara yang lebih baik untuk menangani ini, misalnya enam atau memeriksa versi Python daripada mengandalkan pengecualian. tetapi pada kenyataannya jika Anda sangat peduli tentang sesuatu yang sangat tidak berarti, Anda tidak boleh menyimpan kompatibilitas mundur Python 2 sama sekali karena ini adalah EOL tahun ini.
eandersson
14

urllib mengalami beberapa perubahan pada Python3 dan sekarang dapat diimpor dari submodul parse

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               
Justin Fay
sumber
4

Beginilah cara saya menangani ini, tanpa menggunakan pengecualian.

import sys
if sys.version_info.major > 2:  # Python 3 or later
    from urllib.parse import quote
else:  # Python 2
    from urllib import quote
Yutenji
sumber