URL থেকে প্রোটোকল + হোস্টের নাম পান name


161

আমার জ্যাঙ্গো অ্যাপে, আমাকে request.META.get('HTTP_REFERER')প্রোটোকলের পাশাপাশি রেফারারের কাছ থেকে হোস্টের নামটি নেওয়া দরকার যাতে ইউআরএল থেকে:

আমার পাওয়া উচিত:

আমি অন্যান্য সম্পর্কিত প্রশ্ন সন্ধান করেছি এবং urlparse সম্পর্কে পেয়েছি, কিন্তু এর পরে আর কৌশলটি করা হয়নি

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

উত্তর:


297

আপনার এটি করা উচিত urlparse(ডক্স: পাইথন 2 , পাইথন 3 ):

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
সিঙ্গেলাইজেশন ইলিমিনেশন

@ টোকেনম্যাকগুই: হ্যাঁ, আমার খারাপ ... নিখোঁজ হওয়ার বিষয়টি লক্ষ্য করেনি /
জেরার্ড

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'
starrify

22
Urlparse মডিউলটি পাইথন 3-এ urllib.parse নামকরণ করা হয়েছে So সুতরাং,from urllib.parse import urlparse
স্পার্কএন্ডশাইন

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 সরবরাহ করে, যা আমি বিশ্বাস করি যে এটি লেখক প্রথম স্থানে চেয়েছিলেন।
স্কোন করুন

49

ইউথস্প্লিট ব্যবহার করে পাইথন 3 :

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
@ সিমোনস্টাইনবার্গার :-) এটি সম্পর্কে: 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
জেফ বোয়েন

7

যদি আপনি মনে করেন যে আপনার ইউআরএলটি বৈধ হয় তবে এটি সর্বদা কাজ করবে

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

শেষটি splitভুল, বিভাজনের জন্য আর কোনও ফরোয়ার্ড স্ল্যাশ নেই।
CONvid19

2
এটি কোনও সমস্যা হবে না, যদি আরও কোনও স্ল্যাশ না থাকে তবে তালিকাটি একটি উপাদান দিয়ে ফিরে আসবে। সুতরাং এটি একটি স্ল্যাশ আছে কি না তা কাজ করবে
ZeroErr0r

1
আমি আপনার উত্তরটি সম্পাদনা করে নীচের ভোটটিকে সরাতে সক্ষম হব। সুন্দর ব্যাখ্যা। Tks।
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/fizz/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true


আইএমএইচও সেরা সমাধান, কারণ এটি সহজ এবং এটি বিরল ক্ষেত্রে সব ধরণের বিবেচনা করে। ধন্যবাদ!
সাইমন স্টেইনবার্গার

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

এটি পুনরায় অনুসন্ধানের মাধ্যমে সমাধান করা যেতে পারে ()

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.