Frage

Wie werden Sie den Domain-Namen aus einer URL extrahieren, ohne Subdomains?

Mein erster Versuch war simpel:

'.'.join(urlparse.urlparse(url).netloc.split('.')[-2:])

Dies funktioniert für http://www.foo.com , aber nicht http://www.foo.com.au . Gibt es eine Möglichkeit, dies ohne spezielle Kenntnisse über gültige TLD (Top Level Domains) oder Ländercodes richtig zu machen (weil sie aus).

Dank

War es hilfreich?

Lösung

Nein, gibt es keine „intrinsische“ Art und Weise, dass (zB) zap.co.it des Wissens ist eine Sub-Domain (weil Italiens Registrar Domains verkauft sich wie co.it), während zap.co.uk nicht (weil der Registrar in Großbritannien NICHT Domains verkaufen wie co.uk, aber nur wie zap.co.uk).

Sie müssen nur eine Hilfstabelle (oder Online-Quelle) verwenden, um Ihnen zu sagen, welche TLDs verhalten sich eigenartig wie Großbritanniens und Australiens - es gibt keine Möglichkeit der Wünschelrute, dass aus nur ohne eine solche zusätzliche semantisches Wissen an der Schnur starren (von natürlich kann es schließlich ändern, aber wenn man eine gute Online-Quelle findet diese Quelle auch entsprechend ändern, so hofft man -).

Andere Tipps

Ist hier ein großes Python-Modul jemand dieses Problem, nachdem er diese Frage zu lösen, schrieb: https://github.com/john-kurkowski/tldextract

Das Modul sucht TLDs in dem öffentlicher Suffixliste , mantained von Mozilla Freiwilligen

Zitat:

  

tldextract auf der anderen Seite weiß, was alle gTLDs [ generic Top-Level-Domains ]   und ccTLDs [ Country Code Top-Level-Domains ] aussehen   durch die zur Zeit Lebenden aufzublicken nach dem öffentlichen Suffix   Liste . Also, eine URL angegeben, es kennt seine Sub-Domain von seiner Domäne, und seine   Domäne von seinem Ländercode.

Mit dieser Datei wirksamen tlds , die href="https://stackoverflow.com/questions/569137/how-to-get-domain-name-from-url/569176#569176"> jemand anderes auf Mozillas Website

from __future__ import with_statement
from urlparse import urlparse

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

def get_domain(url, tlds):
    url_elements = urlparse(url)[1].split('.')
    # url_elements = ["abcde","co","uk"]

    for i in range(-len(url_elements), 0):
        last_i_elements = url_elements[i:]
        #    i=-3: ["abcde","co","uk"]
        #    i=-2: ["co","uk"]
        #    i=-1: ["uk"] etc

        candidate = ".".join(last_i_elements) # abcde.co.uk, co.uk, uk
        wildcard_candidate = ".".join(["*"] + last_i_elements[1:]) # *.co.uk, *.uk, *
        exception_candidate = "!" + candidate

        # match tlds: 
        if (exception_candidate in tlds):
            return ".".join(url_elements[i:]) 
        if (candidate in tlds or wildcard_candidate in tlds):
            return ".".join(url_elements[i-1:])
            # returns "abcde.co.uk"

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

print get_domain("http://abcde.co.uk", tlds)

Ergebnisse in:

abcde.co.uk

Ich würde es begrüßen, wenn jemand mich wissen lassen, welche Bits der oben in einer pythonic Weise neu geschrieben werden können. Zum Beispiel muss es eine bessere Art und Weise über die last_i_elements Liste iterieren, aber ich konnte nicht glauben, von einem. Ich weiß nicht, auch wenn ValueError das Beste ist, zu erhöhen. Kommentare?

Mit Python tld

https://pypi.python.org/pypi/tld

Installieren

pip install tld

Holen Sie sich den TLD Namen als Zeichenfolge aus der URL angegeben

from tld import get_tld
print get_tld("http://www.google.co.uk") 
  

co.uk

oder ohne Protokoll

from tld import get_tld

get_tld("www.google.co.uk", fix_protocol=True)
  

co.uk

Holen Sie sich das TLD als Objekt

from tld import get_tld

res = get_tld("http://some.subdomain.google.co.uk", as_object=True)

res
# 'co.uk'

res.subdomain
# 'some.subdomain'

res.domain
# 'google'

res.tld
# 'co.uk'

res.fld
# 'google.co.uk'

res.parsed_url
# SplitResult(
#     scheme='http',
#     netloc='some.subdomain.google.co.uk',
#     path='',
#     query='',
#     fragment=''
# )

Holen Sie sich die ersten Level-Domainnamen als Zeichenfolge aus der URL angegeben

from tld import get_fld

get_fld("http://www.google.co.uk")
# 'google.co.uk'

Hier ist, wie ich damit umgehen:

if not url.startswith('http'):
    url = 'http://'+url
website = urlparse.urlparse(url)[1]
domain = ('.').join(website.split('.')[-2:])
match = re.search(r'((www\.)?([A-Z0-9.-]+\.[A-Z]{2,4}))', domain, re.I)
if not match:
    sys.exit(2)
elif not match.group(0):
    sys.exit(2)

Bis get_tld für alle neuen aktualisiert wird, ziehe ich die TLD aus den Fehler. es ist schlecht Code sicher, aber es funktioniert.

def get_tld():
  try:
    return get_tld(self.content_url)
  except Exception, e:
    re_domain = re.compile("Domain ([^ ]+) didn't match any existing TLD name!");
    matchObj = re_domain.findall(str(e))
    if matchObj:
      for m in matchObj:
        return m
    raise e

In Python habe ich verwenden tldextract , bis er mit einer URL wie www.mybrand.sa.com ausgefallen als subdomain='order.mybrand', domain='sa', suffix='com' Parsen !!

So endlich habe ich beschlossen, diese Methode zu schreiben

WICHTIGER HINWEIS: Dies funktioniert nur mit URLs, die eine Sub-Domain in ihnen haben. Dies ist nicht weiter fortgeschritten Bibliotheken ersetzen wie gemeint tldextract

def urlextract(url):
  url_split=url.split(".")
  if len(url_split) <= 2:
      raise Exception("Full url required with subdomain:",url)
  return {'subdomain': url_split[0], 'domain': url_split[1], 'suffix': ".".join(url_split[2:])}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top