URL से प्रोटोकॉल + होस्ट नाम प्राप्त करें


162

मेरे Django ऐप में, मुझे request.META.get('HTTP_REFERER')इसके प्रोटोकॉल के साथ-साथ रेफ़रर से होस्ट नाम प्राप्त करने की आवश्यकता है ताकि URL जैसे:

मुझे मिलना चाहिए:

मैंने अन्य संबंधित प्रश्नों को देखा और urlparse के बारे में पाया, लेकिन तब से यह चाल नहीं चली

>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'

जवाबों:


297

आप के साथ यह करने के लिए सक्षम होना चाहिए urlparse(: डॉक्स को Python2 , python3 ):

from urllib.parse import urlparse
# from urlparse import urlparse  # Python 2
parsed_uri = urlparse('http://stackoverflow.com/questions/1234567/blah-blah-blah-blah' )
result = '{uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)
print(result)

# gives
'http://stackoverflow.com/'

यह उत्तर तीसरे उदाहरण में एक जोड़ता है , लेकिन मुझे लगता है कि यह प्रश्न की कमी हो सकती है, उत्तर की नहीं। /http://www.domain.com
सिंगलइंजिनेशन इलिमिनेशन

@TokenMacGuy: हाँ, मेरा बुरा ... लापता /
जेरार्ड को

8
urlparse.urlparse()नामांकित-जैसा परिणाम देता है; आप {uri.scheme}://{uri.netloc}/'.format(uri=parsed_uri)पठनीयता के लिए उपयोग कर सकते हैं ।
jfs

12
मुझे नहीं लगता कि यह एक अच्छा समाधान है, जैसा netlocकि डोमेन नहीं है: कोशिश करें urlparse.urlparse('http://user:pass@example.com:8080')और यह 'user:pass@'':8080'
पाएं

22
Urlparse मॉड्यूल का नाम बदलकर urllib.parse है Python 3 में। इसलिए,from urllib.parse import urlparse
SparkAndShine

86

https://github.com/john-kurkowski/tldextract

यह urlparse का अधिक वर्बोज़ संस्करण है। यह आपके लिए डोमेन और उप-डोमेन का पता लगाता है।

उनके प्रलेखन से:

>>> import tldextract
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
>>> tldextract.extract('http://forums.bbc.co.uk/') # United Kingdom
ExtractResult(subdomain='forums', domain='bbc', suffix='co.uk')
>>> tldextract.extract('http://www.worldbank.org.kg/') # Kyrgyzstan
ExtractResult(subdomain='www', domain='worldbank', suffix='org.kg')

ExtractResult नामांकित व्यक्ति है, इसलिए आपके इच्छित भागों तक पहुंचना सरल है।

>>> ext = tldextract.extract('http://forums.bbc.co.uk')
>>> ext.domain
'bbc'
>>> '.'.join(ext[:2]) # rejoin subdomain and domain
'forums.bbc'

2
यह लिखित प्रश्न के लिए सही उत्तर है कि DOMAIN नाम कैसे प्राप्त करें। चुना गया समाधान HOSTNAME प्रदान करता है, जो मुझे लगता है कि लेखक वही चाहता है जो पहले स्थान पर था।
Scone

49

पायथन 3 का उपयोग urlsplit :

from urllib.parse import urlsplit
url = "http://stackoverflow.com/questions/9626535/get-domain-name-from-url"
base_url = "{0.scheme}://{0.netloc}/".format(urlsplit(url))
print(base_url)
# http://stackoverflow.com/

23

शुद्ध स्ट्रिंग ऑपरेशन :):

>>> url = "http://stackoverflow.com/questions/9626535/get-domain-name-from-url"
>>> url.split("//")[-1].split("/")[0].split('?')[0]
'stackoverflow.com'
>>> url = "stackoverflow.com/questions/9626535/get-domain-name-from-url"
>>> url.split("//")[-1].split("/")[0].split('?')[0]
'stackoverflow.com'
>>> url = "http://foo.bar?haha/whatever"
>>> url.split("//")[-1].split("/")[0].split('?')[0]
'foo.bar'

बस आज के लिए इतना ही।


2
अच्छा और सरल विकल्प, लेकिन कुछ मामलों में विफल रहता है, उदाहरण के लिए foo.bar?haha
शमौन स्टाइनबर्गर

1
@SimonSteinberger :-) हाउ'बाउट दिस: url.split("//")[-1].split("/")[0].split('?')[0]:-))
सेबमा

22
>>> import urlparse
>>> url = 'http://stackoverflow.com/questions/1234567/blah-blah-blah-blah'
>>> urlparse.urljoin(url, '/')
'http://stackoverflow.com/'

2
पायथन 3 के लिए आयात है from urllib.parse import urlparse
जेफ बोवेन

8

अगर आपको लगता है कि आपका url वैध है तो यह हर समय काम करेगा

domain = "http://google.com".split("://")[1].split("/")[0] 

अंतिम splitगलत है, विभाजित करने के लिए और अधिक स्लैश नहीं हैं।
CONvid19

2
यह एक समस्या नहीं होगी, अगर फिर भी अधिक स्लैश नहीं होते हैं, तो सूची एक तत्व के साथ वापस आ जाएगी। तो यह काम करेगा कि क्या कोई स्लैश है या नहीं
ZeroErr0r

1
मैंने आपके जवाब को डाउन-वोट को हटाने में सक्षम होने के लिए संपादित किया। अच्छी व्याख्या। टी.के.एस।
CONvid19

5

क्या शुद्ध स्ट्रिंग ऑपरेशन में कुछ गड़बड़ है:

url = 'http://stackoverflow.com/questions/9626535/get-domain-name-from-url'
parts = url.split('//', 1)
print parts[0]+'//'+parts[1].split('/', 1)[0]
>>> http://stackoverflow.com

यदि आप अनुगामी स्लैश संलग्न करना पसंद करते हैं, तो इस लिपि को थोड़ा बढ़ाएँ:

parts = url.split('//', 1)
base = parts[0]+'//'+parts[1].split('/', 1)[0]
print base + (len(url) > len(base) and url[len(base)]=='/'and'/' or '')

कि शायद थोड़ा अनुकूलित किया जा सकता है ...


7
यह गलत नहीं है, लेकिन हमें एक ऐसा उपकरण मिला है जो पहले से ही काम करता है, चलो पहिया को फिर से मजबूत न करें;)
जेरार्ड

5

यहाँ थोड़ा उन्नत संस्करण है:

urls = [
    "http://stackoverflow.com:8080/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "Stackoverflow.com:8080/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "http://stackoverflow.com/some/folder?test=/questions/9626535/get-domain-name-from-url",
    "https://StackOverflow.com:8080?test=/questions/9626535/get-domain-name-from-url",
    "stackoverflow.com?test=questions&v=get-domain-name-from-url"]
for url in urls:
    spltAr = url.split("://");
    i = (0,1)[len(spltAr)>1];
    dm = spltAr[i].split("?")[0].split('/')[0].split(':')[0].lower();
    print dm

उत्पादन

stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com

फिडल: https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true


IMHO सबसे अच्छा समाधान है, क्योंकि सरल और यह सभी प्रकार के दुर्लभ मामलों पर विचार करता है। धन्यवाद!
साइमन स्टाइनबर्गर

2
न तो सरल और न ही बेहतर
कोरी गोल्डबर्ग

यह प्रश्न का हल नहीं है क्योंकि आप प्रोटोकॉल प्रदान नहीं करते हैं (https: // या http: //)
अलेक्सई मारिनिचेंको

2

यह थोड़ा सा विरोध है, लेकिन urlparseदोनों दिशाओं में उपयोग होता है:

import urlparse
def uri2schemehostname(uri):
    urlparse.urlunparse(urlparse.urlparse(uri)[:2] + ("",) * 4)

यह अजीब ("",) * 4सा है क्योंकि urlparse वास्तव में len(urlparse.ParseResult._fields) = 6 के अनुक्रम की अपेक्षा करता है


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने भी आज इसका सामना किया। एक लाइनर के साथ यह हल:

import re
result = re.sub(r'(.*://)?([^/?]+).*', '\g<1>\g<2>', url)

2

मानक पुस्तकालय फ़ंक्शन urllib.parse.urlsplit () आप सभी की जरूरत है। यहाँ पायथन 3 के लिए एक उदाहरण दिया गया है:

>>> import urllib.parse
>>> o = urllib.parse.urlsplit('https://user:pass@www.example.com:8080/dir/page.html?q1=test&q2=a2#anchor1')
>>> o.scheme
'https'
>>> o.netloc
'user:pass@www.example.com:8080'
>>> o.hostname
'www.example.com'
>>> o.port
8080
>>> o.path
'/dir/page.html'
>>> o.query
'q1=test&q2=a2'
>>> o.fragment
'anchor1'
>>> o.username
'user'
>>> o.password
'pass'

1

इसे re.search () द्वारा हल किया जा सकता है

import re
url = 'https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1'
result = re.search(r'^http[s]*:\/\/[\w\.]*', url).group()
print(result)

#result
'https://docs.google.com'

0

डोमेन / होस्टनाम और उत्पत्ति पाने के लिए *

url = '/programming/9626535/get-protocol-host-name-from-url'
hostname = url.split('/')[2] # stackoverflow.com
origin = '/'.join(url.split('/')[:3]) # https://stackoverflow.com

* हेडर Originमें प्रयोग किया जाता हैXMLHttpRequest


0

आप बस दूसरे तर्क के रूप में रिश्तेदार रूट '/' के साथ urljoin का उपयोग कर सकते हैं:

try:
    from urlparse import urljoin  # Python2
except ImportError:
    from urllib.parse import urljoin  # Python3


url = '/programming/9626535/get-protocol-host-name-from-url'

root_url = urljoin(url, '/')

-1

यदि इसमें 3 से कम स्लैश हैं, तो आप इसे प्राप्त कर चुके हैं और यदि नहीं तो हम इसके बीच की घटना का पता लगा सकते हैं:

import re

link = http://forum.unisoftdev.com/something

slash_count = len(re.findall("/", link))
print slash_count # output: 3

if slash_count > 2:
   regex = r'\:\/\/(.*?)\/'
   pattern  = re.compile(regex)
   path = re.findall(pattern, url)

   print path
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.