Получить поддомен из URL с помощью Python - PullRequest
9 голосов
/ 03 августа 2011

Например, адрес:

Address = <a href="http://lol1.domain.com:8888/some/page" rel="noreferrer">http://lol1.domain.com:8888/some/page</a>

Я хочу сохранить поддомен в переменную, чтобы я мог сделать так;

print SubAddr
>> lol1

Ответы [ 7 ]

15 голосов
/ 03 августа 2011

urlparse.urlparse разделит URL-адрес на протокол, местоположение, порт и т. Д. Затем можно разделить местоположение на ., чтобы получить поддомен.

url = urlparse.urlparse(address)
subdomain = url.hostname.split('.')[0]
12 голосов
/ 01 мая 2015

Пакет tldextract делает эту задачу очень простой, и тогда вы можете использовать urlparse , как предлагается, если вам нужна дополнительная информация:

>> import tldextract
>> tldextract.extract("http://lol1.domain.com:8888/some/page"
ExtractResult(subdomain='lol1', domain='domain', suffix='com')
>> tldextract.extract("http://sub.lol1.domain.com:8888/some/page"
ExtractResult(subdomain='sub.lol1', domain='domain', suffix='com')
>> urlparse.urlparse("http://sub.lol1.domain.com:8888/some/page")
ParseResult(scheme='http', netloc='sub.lol1.domain.com:8888', path='/some/page', params='', query='', fragment='')

Обратите внимание, что tldextract правильно обрабатывает субдомены.

5 голосов
/ 03 августа 2011

Модифицированная версия фантастического ответа здесь: Как извлечь доменное имя верхнего уровня (TLD) из URL

Вам потребуется список действующих tlds из здесь

from __future__ import with_statement
from urlparse import urlparse

# load tlds, ignore comments and empty lines:
with open("effective_tld_names.dat.txt") as tldFile:
    tlds = [line.strip() for line in tldFile if line[0] not in "/\n"]

class DomainParts(object):
    def __init__(self, domain_parts, tld):
        self.domain = None
        self.subdomains = None
        self.tld = tld
        if domain_parts:
            self.domain = domain_parts[-1]
            if len(domain_parts) > 1:
                self.subdomains = domain_parts[:-1]

def get_domain_parts(url, tlds):
    urlElements = urlparse(url).hostname.split('.')
    # urlElements = ["abcde","co","uk"]
    for i in range(-len(urlElements),0):
        lastIElements = urlElements[i:]
        #    i=-3: ["abcde","co","uk"]
        #    i=-2: ["co","uk"]
        #    i=-1: ["uk"] etc

        candidate = ".".join(lastIElements) # abcde.co.uk, co.uk, uk
        wildcardCandidate = ".".join(["*"]+lastIElements[1:]) # *.co.uk, *.uk, *
        exceptionCandidate = "!"+candidate

        # match tlds: 
        if (exceptionCandidate in tlds):
            return ".".join(urlElements[i:]) 
        if (candidate in tlds or wildcardCandidate in tlds):
            return DomainParts(urlElements[:i], '.'.join(urlElements[i:]))
            # returns ["abcde"]

    raise ValueError("Domain not in global list of TLDs")

domain_parts = get_domain_parts("http://sub2.sub1.example.co.uk:80",tlds)
print "Domain:", domain_parts.domain
print "Subdomains:", domain_parts.subdomains or "None"
print "TLD:", domain_parts.tld

Дает вам:

Domain: example
Subdomains: ['sub2', 'sub1']
TLD: co.uk
2 голосов
/ 03 августа 2011

То, что вы ищете, находится в: http://docs.python.org/library/urlparse.html

например: ".".join(urlparse('http://www.my.cwi.nl:80/%7Eguido/Python.html').netloc.split(".")[:-2])

сделает работу за вас (вернет "www.my")

0 голосов
/ 02 октября 2018

Мы можем использовать https://github.com/john-kurkowski/tldextract для этой задачи ...

Это просто.

>>> ext = tldextract.extract('http://forums.bbc.co.uk')
>>> (ext.subdomain, ext.domain, ext.suffix)
('forums', 'bbc', 'co.uk')
0 голосов
/ 03 августа 2011

Для извлечения имени хоста я бы использовал urlparse из urllib2:

>>> from urllib2 import urlparse
>>> a = "http://lol1.domain.com:8888/some/page"
>>> urlparse.urlparse(a).hostname
'lol1.domain.com'

Что касается того, как извлечь поддомен, вам необходимо рассмотреть случай, когда полное доменное имя может быть длиннее. Как вы это сделаете, будет зависеть от ваших целей. Я мог бы предложить убрать два самых правых компонента.

* 1006 Е.Г. *

>>> urlparse.urlparse(a).hostname.rpartition('.')[0].rpartition('.')[0]
'lol1'
0 голосов
/ 03 августа 2011

Очень простой подход без проверки работоспособности может выглядеть так:

address = 'http://lol1.domain.com:8888/some/page'

host = address.partition('://')[2]
sub_addr = host.partition('.')[0]

print sub_addr

Это, конечно, предполагает, что когда вы говорите «поддомен», вы подразумеваете первую часть имени хоста, поэтому в следующем случае «www» будет поддоменом:

http://www.google.com/

Это то, что вы имеете в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...