Python: การนำเข้า urllib.quote


112

urllib.quote()ผมอยากจะใช้ แต่ python (python3) ไม่พบโมดูล สมมติว่าฉันมีรหัสบรรทัดนี้:

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

ฉันจะนำเข้า urllib.quote ได้อย่างไร

import urllibหรือ import urllib.quoteทั้งสองอย่างให้

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

สิ่งที่ทำให้ฉันสับสนurllib.requestคือสามารถเข้าถึงได้ทางimport urllib.request

คำตอบ:


183

ใน Python 3.x คุณต้องนำเข้าurllib.parse.quote:

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

ตามเอกสารโมดูลPython 2.xurllib :

บันทึก

urllibโมดูลได้รับการแยกออกเป็นชิ้นส่วนและเปลี่ยนชื่อในหลาม 3 urllib.request, และurllib.parseurllib.error


56

หากคุณต้องการจัดการทั้ง Python 2.x และ 3.x คุณสามารถจับข้อยกเว้นและโหลดทางเลือกอื่นได้

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

คุณยังสามารถใช้ wrapper ความเข้ากันได้ของ python sixเพื่อจัดการสิ่งนี้

from six.moves.urllib.parse import quote

1
คุณควรมองไปข้างหน้ามากกว่านี้ สมมติ python3 และยกเว้น 2.7 ลอง: import urllib.parse เป็น urlparse ยกเว้น ImportError: จาก urlparse import urlparse # python 2.7.11
Lincoln Randall McFarland

@LincolnRandallMcFarland สิ่งที่คุณกำลังพูดถึงคือการเพิ่มประสิทธิภาพไมโครที่ไม่เกี่ยวข้อง ทำให้ไม่ยากขึ้นหรือง่ายขึ้นในการยกเลิกการสนับสนุน Python 2.X ในโครงการในอนาคต
eandersson

หากคุณต้องการทำการขว้างปาและจับข้อยกเว้นให้เป็นขั้นตอนการนำเข้ามาตรฐานของกรณีการใช้งานที่พบบ่อยที่สุดของคุณเพียงเพราะว่า ... มันไม่ได้เป็นวงจรนอกเวลาของฉัน แต่รู้ว่าคุณกำลังทำอะไรอยู่: ข้อยกเว้นควรจะพิเศษ มันคือความแตกต่างระหว่างการทำให้มันทำงานและทำให้ดีขึ้น
Lincoln Randall McFarland

นี่เป็นการสนทนาที่ไร้ความหมาย ทั้งสองอย่างถูกต้อง ... หากคุณจับข้อยกเว้น Python 3 ให้ลองนำเข้าไลบรารี Python 2.7 แต่ด้วยเหตุผลบางประการทั้งสองไม่มีข้อยกเว้นที่เกิดขึ้นจะบอกว่าไม่มีไลบรารี Python 2.7 สับสนมาก ในความเป็นจริงหากคุณสนใจเกี่ยวกับข้อยกเว้นมากมีวิธีที่ดีกว่าในการจัดการสิ่งนี้เช่นหกหรือตรวจสอบเวอร์ชัน Python แทนที่จะใช้ข้อยกเว้น แต่ในความเป็นจริงถ้าคุณสนใจบางสิ่งที่ไร้ความหมายมากขนาดนั้นคุณก็ไม่ควรรักษาความเข้ากันได้ของ Python 2 ไว้ข้างหลังเลยเพราะมันเป็น EOL ในปีนี้อยู่ดี
eandersson

14

urllib ดำเนินการเปลี่ยนแปลงบางอย่างใน Python3 และตอนนี้สามารถนำเข้าจากโมดูลย่อยแยกวิเคราะห์ได้

>>> from urllib.parse import quote  
>>> quote('"')                      
'%22'                               

4

นี่คือวิธีที่ฉันจัดการสิ่งนี้โดยไม่ต้องใช้ข้อยกเว้น

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.