2014-06-13 7 views
6

में यूआरएल घटकों को संशोधित करें क्या Python 2 में किसी URL के कुछ हिस्सों को संशोधित करने का कोई क्लीनर तरीका है? है वहाँ एक क्लीनर समाधानपायथन 2

import urlparse 

url = 'http://foo/bar' 

# Modify path component of URL from 'bar' to 'yah' 
# Use nasty convert-to-list hack due to urlparse.ParseResult being immutable 
parts = list(urlparse.urlparse(url)) 
parts[2] = 'yah' 

url = urlparse.urlunparse(parts) 

:

उदाहरण

http://foo/bar -> http://foo/yah 

वर्तमान में के लिए, मैं यह कर रहा हूँ?

+0

'साफ' से आपका क्या मतलब है? –

उत्तर

16

दुर्भाग्य से, दस्तावेज़ीकरण पुराना है; urlparse.urlparse() (और urlparse.urlsplit()) द्वारा उत्पादित परिणाम आधार के रूप में collections.namedtuple()-produced class का उपयोग करें।

एक सूची में इस namedtuple चालू न करें, लेकिन सिर्फ इस कार्य के लिए प्रदान की उपयोगिता विधि का इस्तेमाल करते हैं:

parts = urlparse.urlparse(url) 
parts = parts._replace(path='yah') 

url = parts.geturl() 

namedtuple._replace() method आप प्रतिस्थापित विशिष्ट तत्वों के साथ एक नई प्रतिलिपि बना सकते हैं। ParseResult.geturl() method फिर भागों को आपके लिए एक यूआरएल में दोबारा जोड़ता है।

डेमो:

>>> import urlparse 
>>> url = 'http://foo/bar' 
>>> parts = urlparse.urlparse(url) 
>>> parts = parts._replace(path='yah') 
>>> parts.geturl() 
'http://foo/yah' 

mgilson प्रलेखन मुद्दे के समाधान के लिए एक bug report (with patch) दायर किया।

+0

मैं इसे इंगित करने जा रहा था। 'Nametuple' द्वारा लौटाए गए सबक्लास द्वारा 'urlparse.ParseResult' को उपयोगिता विधियां प्रदान की जाती हैं। मुझे लगता है कि इसे 2.7 दस्तावेज़ों में इंगित किया जाना चाहिए, क्योंकि इसे जानने के बिना, आपके पास इस वर्ग के लिए सार्वजनिक एपीआई का '_replace' वास्तव में _is_ हिस्सा जानने का कोई तरीका नहीं है ... – mgilson

+0

और भी दिलचस्प है [ 'BaseResult'] (https://docs.python.org/2/library/urlparse.html#urlparse.BaseResult) दस्तावेज़ों में जो स्रोत में प्रकट नहीं होता है ... (digression के बारे में खेद है .. यह देर हो चुकी है ... वैसे भी +1) – mgilson

+0

@ मिगिलसन: हे, वास्तव में, यह 'नामकप्ले' से पहले बचे हुए होने चाहिए। –

-1

मुझे लगता है कि ऐसा करने का उचित तरीका इस तरह है।

_replace निजी विधियों या चर का उपयोग करने के रूप में सुझाव नहीं दिया जाता है।

from urlparse import urlparse, urlunparse 

res = urlparse('http://www.goog.com:80/this/is/path/;param=paramval?q=val&foo=bar#hash') 
l_res = list(res) 
# this willhave ['http', 'www.goog.com:80', '/this/is/path/', 'param=paramval', 'q=val&foo=bar', 'hash'] 
l_res[2] = '/new/path' 
urlunparse(l_res) 
# outputs 'http://www.goog.com:80/new/path;param=paramval?q=val&foo=bar#hash' 
+1

यह सार्वजनिक इंटरफ़ेस का हिस्सा है, यह केवल वास्तविक सदस्यों के साथ संघर्ष न करने के लिए अंडरक्रॉयर के साथ उपसर्ग है। – vidstige

संबंधित मुद्दे