পাইথনে কীভাবে একটি কোয়েরিস্ট্রিং করবেন?


552

আমি জমা দেওয়ার আগে এই স্ট্রিংটি ইউলিনকোড করার চেষ্টা করছি।

queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"]; 

উত্তর:


561

আপনাকে আপনার পরামিতিগুলি urlencode()ম্যাপিং (ডিক), বা 2-টিপলগুলির ক্রম হিসাবে যেমন পাস করতে হবে :

>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'

পাইথন 3 বা তার বেশি

ব্যবহার করুন:

>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event

মনে রাখবেন যে এটি সাধারণভাবে ব্যবহৃত অর্থে ইউআরএল এনকোডিং করে না (আউটপুটটি দেখুন)। যে ব্যবহারের জন্য urllib.parse.quote_plus


12
"মনে রাখবেন যে urllib.urlencode সর্বদা কৌশলটি করে না The "
ব্লেয়ারজ 23

16
প্রযুক্তিগতভাবে, এটি পরিষেবাগুলির মধ্যে একটি বাগ, তাই না?
হোল্ডেনওয়েব

5
এবং আপনি যদি পুরো ক্যোয়ারী আর্গুমেন্ট স্ট্রিংটি তৈরি না করে কেবল একটি স্ট্রিং URL নিরাপদ করতে চান তবে কেউ কীভাবে এটি করতে পারে?
মাইক 'পোম্যাক্স' কামারম্যানস

1
@ Mike'Pomax'Kamermans - যেমন দেখতে stackoverflow.com/questions/12082314/... বা এই প্রশ্নের রিকি এর উত্তর।
বিজিপিটার

1
@ বি কে 0 দেখে মনে হচ্ছে আপনার পদ্ধতিটি কেবল অভিধানের জন্য বৈধ, এবং স্ট্রিং নয়।
জেডি গ্যাম্বোয়া 22

1021

পাইথন 2

আপনি যা সন্ধান করছেন তা হ'ল urllib.quote_plus:

>>> urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')
'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'

পাইথন ঘ

পাইথন 3-এ, urllibপ্যাকেজটিকে ছোট ছোট ভাগে বিভক্ত করা হয়েছে। আপনি ব্যবহার করবেন urllib.parse.quote_plus( parseচাইল্ড মডিউলটি নোট করুন )

import urllib.parse
urllib.parse.quote_plus(...)

4
ধন্যবাদ! আমার ক্ষেত্রে তবে আমি রাখতে হবে:import urllib.parse ... urllib.parse.quote_plus(query)
ivkremer

3
খুব ভাল, তবে ইউনিকোডে কেন ব্যবহার হয় না? ইউআরএল স্ট্রিংটি যদি ইউনিকোড হয় তবে অবশ্যই আমি এটি ইউটিএফ -8 এ এনকোড করব it এটি করার অন্য কোনও উপায় আছে?
কার্ল ডোনেটিজ

7
এটি দুর্দান্ত কাজ করে, তবে আমি এই প্যারামিটারটি নিরাপদ = '; /
?:

আমি যে চেষ্টা পাইথন 3 কিন্তু পেরেছিলেন: stackoverflow.com/questions/40557606/...
amphibient

1
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"কমান্ড লাইনে একটি লাইনারের জন্য
আমোস জোশুয়া

51

Urllib এর পরিবর্তে অনুরোধগুলি চেষ্টা করুন এবং আপনার ইউরেনকোড নিয়ে বিরক্ত করার প্রয়োজন নেই!

import requests
requests.get('http://youraddress.com', params=evt.fields)

সম্পাদনা করুন:

যদি কোনও নামের জন্য আপনার অর্ডার করা নাম-মান জোড় বা একাধিক মান প্রয়োজন হয় তবে এই জাতীয় প্যারাম সেট করুন:

params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]

অভিধান ব্যবহার করার পরিবর্তে।


5
এটি নাম মান জোড় ক্রম করার বিষয়টি বিবেচনা করে না, এছাড়াও এটির জন্য বাহ্যিক লাইব্রেরিগুলি ইনস্টল করার অনুমতি প্রয়োজন যা প্রকল্পের জন্য নাওযোগ্য হতে পারে।
dreftymac

আমি সর্বনিম্ন কোড পোস্ট করেছি যা ওপিতে কাজ করবে। ওপিতে অর্ডার করা জোড়গুলির জন্য অনুরোধ করেনি তবে এটি কার্যকরও, আমার আপডেটটি দেখুন।
বার্নি

@ ড্রেফটিম্যাক: এটি ঠিকানার অর্ডার দেয় (যদিও এটি প্রশ্নের অংশ ছিল না), দয়া করে আমার আপডেট হওয়া উত্তরটি পড়ুন।
বার্নি

36

প্রসঙ্গ

  • পাইথন (সংস্করণ 2.7.2)

সমস্যা

  • আপনি একটি urlencoded ক্যোয়ারী স্ট্রিং উত্পন্ন করতে চান।
  • আপনার কাছে একটি অভিধান বা নাম-মান জুটিযুক্ত অবজেক্ট রয়েছে।
  • আপনি নাম-মান জোড়াগুলির আউটপুট ক্রম নিয়ন্ত্রণ করতে সক্ষম হতে চান।

সমাধান

  • urllib.urlencode
  • urllib.quote_plus

pitfalls

উদাহরণ

নীচে কিছু সমস্যাগুলি কীভাবে মোকাবেলা করতে হয় সে সম্পর্কিত একটি সম্পূর্ণ সমাধান রয়েছে।

### ********************
## init python (version 2.7.2 )
import urllib

### ********************
## first setup a dictionary of name-value pairs
dict_name_value_pairs = {
  "bravo"   : "True != False",
  "alpha"   : "http://www.example.com",
  "charlie" : "hello world",
  "delta"   : "1234567 !@#$%^&*",
  "echo"    : "user@example.com",
  }

### ********************
## setup an exact ordering for the name-value pairs
ary_ordered_names = []
ary_ordered_names.append('alpha')
ary_ordered_names.append('bravo')
ary_ordered_names.append('charlie')
ary_ordered_names.append('delta')
ary_ordered_names.append('echo')

### ********************
## show the output results
if('NO we DO NOT care about the ordering of name-value pairs'):
  queryString  = urllib.urlencode(dict_name_value_pairs)
  print queryString 
  """
  echo=user%40example.com&bravo=True+%21%3D+False&delta=1234567+%21%40%23%24%25%5E%26%2A&charlie=hello+world&alpha=http%3A%2F%2Fwww.example.com
  """

if('YES we DO care about the ordering of name-value pairs'):
  queryString  = "&".join( [ item+'='+urllib.quote_plus(dict_name_value_pairs[item]) for item in ary_ordered_names ] )
  print queryString
  """
  alpha=http%3A%2F%2Fwww.example.com&bravo=True+%21%3D+False&charlie=hello+world&delta=1234567+%21%40%23%24%25%5E%26%2A&echo=user%40example.com
  """ 


23

এটা চেষ্টা কর:

urllib.pathname2url(stringToURLEncode)

urlencodeকাজ করবে না কারণ এটি কেবল অভিধানে কাজ করে। quote_plusসঠিক আউটপুট উত্পাদন করেনি।


এটি সত্যিই সহায়ক! আমার ক্ষেত্রে, আমার কাছে কেবল স্ট্রিংয়ের একটি অংশ রয়েছে যা আমি ইউআরএল-এনকোড করতে চাই, উদাহরণস্বরূপ আমি রূপান্তর my stringকরতে চাই my%20string। আপনার সমাধানটি এটির জন্য কবজির মতো কাজ করে!
টাঙ্গুইপি

%20পরিবর্তে আমার জন্য কাজ করেছেন +। ধন্যবাদ
জোসেফ হারুশ

21

মনে রাখবেন যে urllib.urlencode সর্বদা কৌতুক করে না। সমস্যাটি হ'ল কিছু পরিষেবা আর্গুমেন্টের ক্রমকে যত্ন করে, আপনি অভিধান তৈরি করার সময় হারিয়ে যায়। এই জাতীয় ক্ষেত্রে, রিকি প্রস্তাবিত হিসাবে urllib.quote_plus আরও ভাল।


2
এটি টিপলগুলির একটি তালিকা পাস করলে এটি সূক্ষ্মভাবে কাজ করে এবং অর্ডার সংরক্ষণ করে:>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
ব্র্যান্ডন রোডস


6

ভবিষ্যতের রেফারেন্সের জন্য (উদা: পাইথন 3 এর জন্য)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'

1
সাধারণত আপনি কেবল মানগুলি
ইউরোল

'c:/2 < 3'উইন্ডোজ জন্য আউটপুট হয় '///C://2%20%3C%203'। আমি এমন কিছু চাই যা কেবল আউটপুট করে 'c:/2%20%3C%203'
বিনকি

3

স্ক্রিপ্ট / প্রোগ্রামগুলিতে ব্যবহারের জন্য যা পাইথন 2 এবং 3 উভয়কে সমর্থন করতে হবে, ছয়টি মডিউল উদ্ধৃতি এবং ইউরেনকোড ফাংশন সরবরাহ করে:

>>> from six.moves.urllib.parse import urlencode, quote
>>> data = {'some': 'query', 'for': 'encoding'}
>>> urlencode(data)
'some=query&for=encoding'
>>> url = '/some/url/with spaces and %;!<>&'
>>> quote(url)
'/some/url/with%20spaces%20and%20%25%3B%21%3C%3E%26'

2

যদি urllib.parse.urlencode () আপনাকে ত্রুটি দিচ্ছে, তবে urllib3 মডিউলটি চেষ্টা করুন।

সিনট্যাক্স নিম্নরূপ:

import urllib3
urllib3.request.urlencode({"user" : "john" }) 

1

আর একটি বিষয় যা ইতিমধ্যে উল্লেখ করা যায় নি তা হ'ল urllib.urlencode()অভিধানে খালি মানগুলি স্ট্রিং হিসাবে এনকোড Noneকরে প্যারামিটারটি অনুপস্থিত থাকার পরিবর্তে। আমি জানি না এটি সাধারণত পছন্দসই হয় কি না তবে আমার ব্যবহারের ক্ষেত্রে এটি খাপ খায় না, তাই আমাকে ব্যবহার করতে হবে quote_plus


0

পাইথন 3 urllib3 সঠিকভাবে কাজ করার জন্য, আপনি এর অফিসিয়াল ডক্স অনুযায়ী অনুসরণ করতে পারেন :

import urllib3

http = urllib3.PoolManager()
response = http.request(
     'GET',
     'https://api.prylabs.net/eth/v1alpha1/beacon/attestations',
     fields={  # here fields are the query params
          'epoch': 1234,
          'pageSize': pageSize 
      } 
 )
response = attestations.data.decode('UTF-8')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.