În Django app, am nevoie pentru a obține numele de gazdă de la referrer în cerere.META.ia('HTTP_REFERER')`, împreună cu protocolul său, astfel încât de la Url-uri, cum ar fi:
Mi-ar trebui:
M-am uitat peste alte întrebări legate de și-a găsit despre urlparse, dar asta nu't face truc de
>>> urlparse(request.META.get('HTTP_REFERER')).hostname
'docs.google.com'
Tu ar trebui să fie capabil să-l facă cu urlparse` (docs: 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/'
https://github.com/john-kurkowski/tldextract
Aceasta este o mult mai detaliată versiune de urlparse. Acesta detectează domenii și subdomenii pentru tine.
Din documentația lor:
>>> 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
este un namedtuple, deci's simplu de a accesa piesele pe care doriți.
>>> ext = tldextract.extract('http://forums.bbc.co.uk')
>>> ext.domain
'bbc'
>>> '.'.join(ext[:2]) # rejoin subdomain and domain
'forums.bbc'
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/
Pur șir de operații :):
>>> 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'
Ca's toate, oameni buni.
Aici este o versiune ușor îmbunătățită:
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
Ieșire
stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com
stackoverflow.com
Vioara: https://pyfiddle.io/fiddle/23e4976e-88d2-4757-993e-532aa41b7bf0/?i=true
Este ceva în neregulă cu pur șir de operațiuni:
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
Dacă preferați având un slash de final anexată, să extindă acest scenariu un pic astfel:
parts = url.split('//', 1)
base = parts[0]+'//'+parts[1].split('/', 1)[0]
print base + (len(url) > len(base) and url[len(base)]=='/'and'/' or '')
Probabil că asta poate fi optimizat un pic ...
Acest lucru este un pic obtuz, dar foloseste urlparse în ambele direcții:
import urlparse
def uri2schemehostname(uri):
urlparse.urlunparse(urlparse.urlparse(uri)[:2] + ("",) * 4)
asta ciudat ("",) * 4
este pentru că urlparse se așteaptă o secvență de exact len(urlparse.ParseResult._fields)
= 6
Știu că's o întrebare veche, dar am prea întâlnit-o astăzi. Rezolvat acest lucru cu o singură linie:
import re
result = re.sub(r'(.*://)?([^/?]+).*', '\g<1>\g<2>', url)
pentru a obține domeniu/nume de gazdă și de Origine*
url = 'https://stackoverflow.com/questions/9626535/get-protocol-host-name-from-url'
hostname = url.split('/')[2] # stackoverflow.com
origin = '/'.join(url.split('/')[:3]) # https://stackoverflow.com
*"Origine" este folosit în XMLHttpRequest` antete
Acesta ar putea fi rezolvate prin re.de căutare() `` import re url = 'https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1' rezultat = re.căutare(r'^http[s]:\/\/[\w.]', url-ul).grupul() print(urmare)
'https://docs.google.com' ``
În cazul în care conține mai puțin de 3 linii oblice astfel,'am primit și dacă nu, atunci putem găsi apariția între acesta:
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