2012-03-02 13 views
14

होस्टनाम तथा बंदरगाह पार्स मैं इन स्वरूपों में से किसी में एक स्ट्रिंग दिया जा सकता है:स्ट्रिंग या यूआरएल

  • यूआरएल: जैसे http://www.acme.com:456

  • स्ट्रिंग: जैसे www.acme.com:456, www.acme.com 456, या www.acme.com

मैं मेजबान निकालना चाहता हूं और यदि कोई पोर्ट पेश करता हूं। यदि पोर्ट मान मौजूद नहीं है तो मैं इसे 80 तक डिफ़ॉल्ट करना चाहता हूं।

मैंने urlparse की कोशिश की है, जो यूआरएल के लिए ठीक काम करता है, लेकिन अन्य प्रारूप के लिए नहीं। जब मैं होस्टनाम पर urlparse का उपयोग करता हूं: उदाहरण के लिए पोर्ट, यह होस्टल को नेटलोक की बजाय योजना में रखता है।

मैं ऐसे समाधान से खुश हूं जो urlparse और regex का उपयोग करता है, या एक एकल regex जो दोनों प्रारूपों को संभाल सकता है।

+0

क्या regex आप की कोशिश की है है? यदि रेगेक्स नहीं है तो आपने जो कोड लिखा है वह क्या है? –

उत्तर

2

मुझे लगता है कि urlparse से परिचित नहीं हूँ, लेकिन regex का उपयोग कर आप की तरह कुछ करना चाहते हैं:

p = '(?:http.*://)?(?P<host>[^:/ ]+).?(?P<port>[0-9]*).*' 

m = re.search(p,'http://www.abc.com:123/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '123' 

या, बंदरगाह के बिना:

m = re.search(p,'http://www.abc.com/test') 
m.group('host') # 'www.abc.com' 
m.group('port') # '' i.e. you'll have to treat this as '80' 

संपादित करें: तय regex भी मैच के लिए ' www.abc.com 123 '

+0

धन्यवाद यह वास्तव में उपयोगी लगता है। – TonyM

+2

मुझे लगता है कि नीचे दिए गए वोट इस समाधान के कारण अत्यधिक जटिल हैं। मैं इसे स्वीकार करता हूं, और यह कहकर @ntziolis से सहमत हूं कि आपको संभव होने पर मानक कार्यक्षमता का उपयोग करने का प्रयास करना चाहिए। – claesv

+0

मानक urlparse स्ट्रिंग के लिए काम नहीं करेगा (http (एस) या // से शुरू नहीं) तो यह समाधान उपयोगी प्रतीत होता है। व्याख्या के बिना downvote क्यों। –

7

कारण इसके लिए विफल रहता है:

www.acme.com 456 

इसलिए है क्योंकि यह वैध यूआरआई नहीं है। आप क्यों नहीं बस नहीं है:

  1. एक :
  2. के साथ अंतरिक्ष की जगह मानक urlparse विधि

कोशिश का उपयोग करके जिसके परिणामस्वरूप स्ट्रिंग पार्स और संभव के रूप में ज्यादा के रूप में डिफ़ॉल्ट कार्यक्षमता का उपयोग करने के, विशेष रूप से जब यह पार्सिंग जैसी चीज़ों की बात आती है तो यूआरआई जैसे स्वरूपों को अच्छी तरह से जानते हैं।

+2

जब मैं मेजबान पर urlparse का उपयोग करता हूं: पोर्ट यह होस्टल को नेटलोक की बजाय योजना में रखता है। – TonyM

+2

मैनुअल से: "आरएफसी 1808 में सिंटैक्स विनिर्देशों के बाद, urlparse केवल netloc को पहचानता है अगर इसे ठीक से '//' द्वारा पेश किया जाता है। अन्यथा इनपुट को एक सापेक्ष यूआरएल माना जाता है और इस प्रकार पथ घटक से शुरू होता है।" – ntziolis

+1

इसे हल करने के लिए, – ntziolis

31

आप URL स्ट्रिंग से होस्ट नाम पाने के लिए urlparse उपयोग कर सकते हैं:

from urlparse import urlparse 
print urlparse("http://www.website.com/abc/xyz.html").hostname # prints www.website.com 
4
>>> from urlparse import urlparse 
>>> aaa = urlparse('http://www.acme.com:456') 

>>> aaa.hostname 
'www.acme.com' 

>>> aaa.port 
456 
>>> 
संबंधित मुद्दे