ถ้าฉันทำ
url = "http://example.com?p=" + urllib.quote(query)
- มันไม่ได้เข้ารหัส
/
ไปที่%2F
(หยุดพักการฟื้นฟู OAuth) - มันไม่ได้จัดการกับ Unicode (มันส่งข้อยกเว้น)
มีห้องสมุดที่ดีกว่านี้ไหม
ถ้าฉันทำ
url = "http://example.com?p=" + urllib.quote(query)
/
ไปที่%2F
(หยุดพักการฟื้นฟู OAuth)มีห้องสมุดที่ดีกว่านี้ไหม
คำตอบ:
จากเอกสาร :
urllib.quote(string[, safe])
แทนที่อักขระพิเศษในสตริงโดยใช้ตัวหนี% xx จะไม่มีการอ้างถึงตัวอักษรตัวเลขและอักขระ '_.-' โดยค่าเริ่มต้นฟังก์ชั่นนี้มีไว้สำหรับการอ้างอิงส่วนเส้นทางของ URL พารามิเตอร์ตัวเลือกที่ปลอดภัยระบุตัวละครเพิ่มเติมที่ไม่ควรยกมา - ค่าเริ่มต้นของมันคือ '/'
นั่นหมายถึงการผ่าน '' เพื่อความปลอดภัยจะช่วยแก้ไขปัญหาแรกของคุณ
>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'
เกี่ยวกับปัญหาที่สองมีการรายงานข้อผิดพลาดเกี่ยวกับเรื่องนี้ที่นี่ เห็นได้ชัดว่ามันถูกแก้ไขใน python 3 คุณสามารถแก้ไขได้โดยการเข้ารหัสเป็น utf8 ดังนี้:
>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller
โดยวิธีการดูurlencode
เดียวกันยกเว้นแทนที่ด้วยurllib.quote
urllib.parse.quote
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
ซึ่งเป็นสิ่งที่ urllib.quote กำลังติดต่อด้วย
urllib.quote
ย้ายไปurlib.parse.quote
ตั้งแต่ Python3
urllib.parse.quote
เอกสาร
ใน Python 3 urllib.quote
ถูกย้ายไปที่urllib.parse.quote
และจะจัดการ unicode ตามค่าเริ่มต้น
>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'
quote
ค่อนข้างคลุมเครือในระดับโลก มันอาจจะดีกว่าที่จะใช้สิ่งที่ต้องการ from urllib.parse import quote as urlencode
urlencode:
urlencode
อยู่urllib.parse
แล้วและทำสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิงดังนั้นคุณควรเลือกชื่ออื่นหรือเสี่ยงที่จะทำให้ผู้อ่านรหัสของคุณสับสนในอนาคต
คำตอบของฉันคล้ายกับคำตอบของเปาโล
ฉันคิดว่าโมดูลrequests
ดีกว่ามาก urllib3
ก็ขึ้นอยู่กับ คุณสามารถลองสิ่งนี้:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quote
เป็น wrapper เข้ากันได้บางurllib.quote
สำหรับ python 2 และurllib.parse.quote
สำหรับ python 3
หากคุณใช้ django คุณสามารถใช้ urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
โปรดทราบว่าการเปลี่ยนแปลงเป็น Python ตั้งแต่คำตอบนี้ได้รับการเผยแพร่หมายความว่าตอนนี้นี่เป็น wrapper ดั้งเดิม จากซอร์สโค้ด Django สำหรับ django.utils.http:
A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)
มันจะดีกว่าที่จะใช้urlencode
ที่นี่ ไม่แตกต่างกันมากสำหรับพารามิเตอร์เดียว แต่ IMHO ทำให้รหัสชัดเจนขึ้น (มันดูสับสนที่จะเห็นฟังก์ชั่นquote_plus
! โดยเฉพาะอย่างยิ่งผู้ที่มาจากภาษาอื่น ๆ )
In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'
In [22]: val=34
In [23]: from urllib.parse import urlencode
In [24]: encoded = urlencode(dict(p=query,val=val))
In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34
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