2011-08-03 40 views

Odpowiedz

14

urlparse.urlparse podzieli URL do protokołu, lokalizacji portu itp Następnie można podzielić lokalizację . uzyskać subdomeny.

url = urlparse.urlparse(address) 
subdomain = url.hostname.split('.')[0] 
+0

Działa bardzo dobrze. Użyłem go tak, jak Node = urlparse.urlparse (address) .hostname.split ('.') [0] – Marko

+3

Co jeśli jest to adres IP? A co, jeśli ma subdomenę drugiego poziomu? – naktinis

+1

Subdomeny mogą zawierać wiele kropek, więc 'api.test' jest również ważny, należy o tym pamiętać. Jeśli potrzebujesz dobrego pakietu do tego, sprawdź 'https: // pypi.python.org/pypi/tldextract'. – sidneydobber

0

Bardzo podstawowe podejście, bez rozsądku kontrola mogłaby wyglądać następująco:

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

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

print sub_addr 

To oczywiście zakłada, że ​​kiedy mówisz „subdomeny” masz na myśli pierwszą część nazwy hosta, a więc w następujący przypadek: 'www' byłaby subdomeny:

http://www.google.com/

że to, co masz na myśli?

0

do wydobywania hosta, użyję urlparse z urllib2:

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

, jak wyodrębnić subdomenę, trzeba pokryć w przypadku, gdy istnieje FQDN może być dłuższy. Sposób, w jaki to zrobisz, zależy od twoich celów. Mogę zasugerować zdejmowanie dwóch najbardziej prawych komponentów.

E.g.

>>> urlparse.urlparse(a).hostname.rpartition('.')[0].rpartition('.')[0] 
'lol1' 
2

Co szukasz jest: http://docs.python.org/library/urlparse.html

na przykład: ".".join(urlparse('http://www.my.cwi.nl:80/%7Eguido/Python.html').netloc.split(".")[:-2])

zrobi dla ciebie zadanie (powróci "www.my")

+1

Zakłada się, że główna nazwa domeny składa się z dwóch części - która w niektórych przypadkach zostanie utracona, np. adresy .co.uk'. Poza Wielką Brytanią, Izraelem, Brazylią i Japonią wszystkie mają formalne domeny drugiego poziomu i prawdopodobnie są też inne. –

+0

Moja odpowiedź dotyczy tego problemu przy użyciu listy prawidłowych TLD. – Acorn

5

Modified wersja fantastycznej odpowiedzi tutaj: How to extract top-level domain name (TLD) from URL

Musisz listę skutecznych TLD z here

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 

Daje:

 
Domain: example 
Subdomains: ['sub2', 'sub1'] 
TLD: co.uk 
+0

Staruszek, ale dobry! – FredTheWebGuy

+0

lepiej niż to. –

4

Pakiet tldextract sprawia, że ​​jest to zadanie bardzo łatwe, a następnie można użyć urlparse jak sugeruje jeśli potrzebujesz dalszych informacji:

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

Należy pamiętać, że tldextract poprawnie obsługuje subdomeny.

+0

To powinna być odpowiedź. Dziękuję Ci. –

Powiązane problemy