Получить имя протокола + хоста из URL

В моем приложении Django мне нужно получить имя хоста от реферера в request.META.get('HTTP_REFERER') вместе с его протоколом, чтобы из URL-адресов, таких как:

  • https://docs.google.com/spreadsheet/ccc?key=blah-blah-blah-blah#gid=1
  • https://stackoverflow.com/questions/1234567/blah-blah-blah-blah
  • http://www.example.com
  • https://www.other-domain.com/whatever/blah/blah/?v1=0&v2=blah+blah …

Я должен получить:

  • https://docs.google.com/
  • https://stackoverflow.com/
  • http://www.example.com
  • https://www.other-domain.com/

Я просмотрел другие связанные вопросы и нашел о urlparse, но это не помогло с тех пор

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

Вы должны иметь возможность сделать это с помощью 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

Это более подробная версия 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 – это namedtuple, поэтому вам просто получить доступ к тем частям, которые вы хотите.

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

Python3 с использованием 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/ 

Чистые струнные операции :):

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

Вот и все, ребята.

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

Вот немного улучшенная версия:

 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 

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

Что-то не так с чистыми строковыми операциями:

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

Возможно, это немного оптимизировано …

если вы считаете, что ваш URL-адрес действителен, это будет работать все время

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

Это немного тупо, но использует urlparse в обоих направлениях:

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

этот нечетный ("",) * 4 бит – это потому, что urlparse ожидает последовательность точно len(urlparse.ParseResult._fields) = 6

Если он содержит менее 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 

Вы можете использовать urlparse из библиотеки urllib :

 from urllib.parse import urlparse o = urlparse("http://www.example.com/br/pages/") domain = "://".join([o.scheme, o.netloc]) 
  • Как поместить переменную внутри строки в Python?
  • Ускорение pandas.DataFrame.to_sql с помощью fast_executemany из pyODBC
  • Преобразовать число с плавающей запятой в определенную точность, а затем скопировать в строку
  • Python 3 возвращает «недопустимый синтаксис» при попытке выполнить интерполяцию строк
  • Как повторить попытку после исключения?
  • Когда следует использовать ugettext_lazy?
  • Использовать «модуль импорта» или «из импорта модуля»?
  • Присоедините список элементов с разными типами в виде строки в Python
  • Как перечислить все функции в модуле Python?
  • Удалить элемент из словаря, когда его ключ неизвестен
  • Yum erase python = разрушение
  • Interesting Posts

    Клавиши «Окно» + «Горячие клавиши стрелок» не работают

    В чем разница между Invoke () и BeginInvoke ()

    dplyr :: select вызовы функции с помощью MASS :: select

    Заменить все вхождения строки с помощью StringBuilder?

    Что плохого в ленивом вводе-выводе?

    Дублировать и переименовывать проекты Xcode и связанные с ними папки

    Почему существует оператор стрелки (->) в C?

    Устранение неполадок использования центрального процессора с помощью процесса «Система»

    Как установить определенную версию набора модhive Perl?

    Что такое segmentation fault?

    Обнаружение переключателя iPhone / Silent / Mute iPhone с использованием AVAudioPlayer не работает?

    Синхронизировать Outlook 2007 с Календарем Google, используя настройку уведомлений по умолчанию в GCal для новых событий?

    Как проверить, работает ли приложение на Android?

    XML-схема minOccurs / maxOccurs значения по умолчанию

    Создание удлинительных кабелей USB с использованием кабеля UTP

    Давайте будем гением компьютера.