ডাইক পাইথনে ইউআরএল কোয়েরি প্যারামিটার


104

ইউআরএল (কিছু পাইথন লাইব্রেরি সহ) কে বিশ্লেষণ করার এবং ইউআরএলটির কোয়েরি প্যারামিটারগুলির কীগুলি এবং মানগুলি দিয়ে পাইথন অভিধানটি ফেরত দেওয়ার কোনও উপায় আছে?

উদাহরণ স্বরূপ:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

প্রত্যাশিত ফেরত:

{'ct':32, 'op':92, 'item':98}

উত্তর:


199

urllib.parseগ্রন্থাগারটি ব্যবহার করুন :

>>> from urllib import parse
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='www.example.org', path='/default.html', query='ct=32&op=92&item=98', fragment='')
>>> parse.parse_qs(parse.urlsplit(url).query)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(parse.parse_qsl(parse.urlsplit(url).query))
{'item': '98', 'op': '92', 'ct': '32'}

urllib.parse.parse_qs()এবং urllib.parse.parse_qsl()পদ্ধতি ক্যোয়ারী স্ট্রিং আউট পার্স একাউন্টে গ্রহণ যে কী একাধিকবার ঘটতে পারে এবং যাতে কোন ব্যাপার হতে পারে।

আপনি এখনও পাইথন 2 এ থাকলে, urllib.parseডাকা হত urlparse


38

পাইথন 3 এর জন্য ডেকের মানগুলি parse_qsএকটি তালিকায় রয়েছে কারণ একাধিক মান থাকতে পারে। আপনি যদি কেবল প্রথমটি চান:

>>> from urllib.parse import urlsplit, parse_qs
>>>
>>> url = "http://www.example.org/default.html?ct=32&op=92&item=98"
>>> query = urlsplit(url).query
>>> params = parse_qs(query)
>>> params
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> dict(params)
{'item': ['98'], 'op': ['92'], 'ct': ['32']}
>>> {k: v[0] for k, v in params.items()}
{'item': '98', 'op': '92', 'ct': '32'}

4
এটি পাইথন 3-এ অনন্য নয়, পাইথন 2 urllib.parse_qsমানগুলির জন্য তালিকাও ফিরিয়ে দেয়। আমি বিশেষ করে আমার উত্তরে এটি উল্লেখ করেছি, উপায় দ্বারা, আপনি urllib.parse_qsl()পরিবর্তে এবং ফলাফলের তালিকাটি অতীত ব্যবহার করতে চাইতে পারেন dict()যদি আপনি কেবল একক মান চান।
মার্টিজন পিটারস

পার্থক্য মত মনে হয় সঙ্গে parse_qlsযে যেহেতু এটা tuples একটি তালিকা ফেরৎ, রূপান্তর হয় যে একটি অভি রাখা হবে গত পরিবর্তে মান প্রথম । এটি অবশ্যই ধরে নেওয়া যায় যে এখানে একাধিক মান শুরু হয়েছিল values
পুনরায় 11

11

আপনি যদি পার্সার ব্যবহার না করা পছন্দ করেন:

url = "http://www.example.org/default.html?ct=32&op=92&item=98"
url = url.split("?")[1]
dict = {x[0] : x[1] for x in [x.split("=") for x in url[1:].split("&") ]}

সুতরাং আমি উপরেরটি মুছব না তবে এটি আপনার ব্যবহার করা উচিত তা অবশ্যই নয়।

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

এটা ব্যবহার কর:

from urllib import parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

এবং পাইথন ২ এক্স এর জন্য

import urlparse as parse
params = dict(parse.parse_qsl(parse.urlsplit(url).query))

আমি জানি এটি কেবল গ্রহণযোগ্য উত্তর হিসাবে একই, কেবল একটি লাইনের অনুলিপি করা যায়।


8
পার্সিংয়ের সাথে কেবল স্ট্রিং বিভক্ত হওয়ার চেয়ে বেশি কিছু জড়িত। আপনাকে ইউআরএল এনকোডিংও হ্যান্ডেল করতে হবে (সহ +) এবং urllib.parseঅনুরোধ হিসাবে আপনার জন্য ত্রুটিগুলি উত্থাপন বা উপেক্ষা করে। আমি নিশ্চিত নই যে আপনি যখন এই লাইব্রেরির স্ট্যান্ডার্ড লাইব্রেরির অংশ তখন কেন এই চাকাটি পুনঃস্থাপন করতে চান।
মার্টিজন পিটারস

6

অজগর জন্য 2.7

In [14]: url = "http://www.example.org/default.html?ct=32&op=92&item=98"

In [15]: from urlparse import urlparse, parse_qsl

In [16]: parse_url = urlparse(url)

In [17]: query_dict = dict(parse_qsl(parse_url.query))

In [18]: query_dict
Out[18]: {'ct': '32', 'item': '98', 'op': '92'}

5

আমি চাকাটিকে পুনরায় উদ্ভাবন না করার বিষয়ে একমত তবে মাঝে মাঝে (যখন আপনি শিখছেন) এটি চাকা বোঝার জন্য চাকা তৈরি করতে সহায়তা করে। :) সুতরাং, নিখুঁত একাডেমিক দৃষ্টিকোণ থেকে, আমি এই সাবধানতার সাথে প্রস্তাব দিচ্ছি যে একটি অভিধান ব্যবহার করে ধরে নেওয়া হয় যে নামের মান জোড়াটি অনন্য (যে ক্যোয়ারী স্ট্রিংয়ের একাধিক রেকর্ড নেই)।

url = 'http:/mypage.html?one=1&two=2&three=3'

page, query = url.split('?')

names_values_dict = dict(pair.split('=') for pair in query.split('&'))

names_values_list = [pair.split('=') for pair in query.split('&')]

আমি নিষ্ক্রিয় আইডিইতে 3.6.5 সংস্করণ ব্যবহার করছি।


0

যেহেতু python2.7আমি urlparseইউআরএল ক্যোয়ারিকে ডিকটিতে পার্স করতে মডিউলটি ব্যবহার করছি ।

import urlparse

url = "http://www.example.org/default.html?ct=32&op=92&item=98"

print urlparse.parse_qs( urlparse.urlparse(url).query )
# result: {'item': ['98'], 'op': ['92'], 'ct': ['32']} 

আসল ইউআরএলটিকে পুনঃনির্মাণ না করার উপায় আছে কি কেবল আইটেমটি সরিয়ে দিয়ে।
জন কনস্টান্টাইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.