سؤال

إذا فعلت

url = "http://example.com?p=" + urllib.quote(query)
  1. لا ينفد / ل %2F (يكسر التطبيع Oauth)
  2. لا يتعامل مع 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top