كيفية ترميز المعلمات URL في بيثون؟
سؤال
إذا فعلت
url = "http://example.com?p=" + urllib.quote(query)
- لا ينفد
/
ل%2F
(يكسر التطبيع Oauth) - لا يتعامل مع Unicode (يلقي استثناء)
هل هناك مكتبة أفضل؟
المحلول
من مستندات:
urllib.quote(string[, safe])
استبدال الأحرف الخاصة في السلسلة باستخدام الهروب٪ xx. لا يتم نقل الحروف والأرقام والأحرف "_.-". بشكل افتراضي، تهدف هذه الوظيفة إلى نقلا عن قسم المسار الخاص بعنوان URL.the المعلمة الآمنة الاختيارية تحدد أحرف إضافية لا ينبغي نقلها - القيمة الافتراضية لها هي "/"
هذا يعني تمرير "للأمان ستحل مشكلتك الأولى:
>>> 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
في python3.
نصائح أخرى
في بيثون 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/'
جوابي مشابه إجابة باولو.
أعتقد الوحدة requests
هو أفضل بكثير. انها تستند إلى urllib3
وبعد يمكنك تجربة هذا:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
إذا كنت تستخدم Django، يمكنك استخدام Urlquote:
>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'
لاحظ أن التغييرات في Python منذ نشر هذه الإجابة تعني أن هذا هو الآن غلاف كبير. من التعليمات البرمجية المصدر DJango 2.1 ل 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#eurllib.parse.urlencode.
Quote_Plus: https://docs.python.org/3/library/urllib.parse.html#eurllib.parse.quote_plus.