Wie Top-Level-Domain-Namen (TLD) von URL zu extrahieren
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
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
Ergebnisse in: 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 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)
abcde.co.uk
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'
Es gibt viele, viele TLD. Hier ist die Liste:
http://data.iana.org/TLD/tlds -alpha-by-domain.txt
Hier ist eine andere Liste
http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains
Hier ist eine andere Liste
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:])}