2009-10-05 6 views

Antwort

24

den Hostnamen zu erhalten ist einfach genug urlparse mit:

hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname 

Abrufen der „Stammdomäne“, jedoch wird mehr als problematisch, weil es nicht in syntaktischen Bereich definiert ist. Was ist die Hauptdomain von "www.theregister.co.uk"? Wie wäre es mit Netzwerken, die Standarddomänen verwenden? "devbox12" könnte ein gültiger Hostname sein.

Eine Möglichkeit, dies zu umgehen, wäre die Public Suffix List, die versucht, sowohl echte Top-Level-Domains (zB ".com", ".net", ".org") als auch private Domains zu katalogisieren, die sind verwendet wie TLDs (zB ".co.uk" oder sogar ".github.io"). Sie können die PSL aus Python Zugriff auf die publicsuffix2 Bibliothek:

import publicsuffix 
import urlparse 

def get_base_domain(url): 
    # This causes an HTTP request; if your script is running more than, 
    # say, once a day, you'd want to cache it yourself. Make sure you 
    # update frequently, though! 
    psl = publicsuffix.fetch() 

    hostname = urlparse.urlparse(url).hostname 

    return publicsuffix.get_public_suffix(hostname, psl) 
+0

Bitte erklären Sie, wie dieser Code hostname = ".". join (len (hostname [-2]) <4 und hostname [-3:] oder hostname) [-2:]) funktioniert? Danke – Joozty

+0

@Joozty - Negative Indizes beginnen vom Ende, so 'Hostname [-2]' bedeutet den vorletzten Eintrag (in diesem Fall der Hostname durch Punkte geteilt). 'foo und bar oder baz 'funktioniert ähnlich wie ein ternäres: Wenn" foo "wahr ist, gebe" bar "zurück; Andernfalls gib "baz" zurück. Schließlich bedeutet 'hostname [-3:]' die letzten drei Teile. Zusammen heißt das: "Wenn der vorletzte Teil des Hostnamens kürzer als vier Zeichen ist, verwende die letzten drei Teile und verbinde sie mit Punkten. Ansonsten nimm nur die letzten beiden Teile und verbinde sie zusammen." –

+0

Aus irgendeinem Grund, auch nach der Installation des Moduls, auf Python 3 bekomme ich 'ImportError: kann den Namen 'get_public_suffix' nicht importieren. Konnte keine Antwort online oder in der Dokumentation finden, also benutze einfach "tldextract", was einfach funktioniert! Natürlich musste ich zuerst "pip3 install tldextract" installieren. – Nagev

-4

Dies ist für meine Zwecke gearbeitet. Ich dachte, ich würde es teilen.

".".join("www.sun.google.com".split(".")[-2:]) 
+3

Wie testen Sie "www.sun.google.de"? Sie werden "co.uk" anstelle von "google.co.uk" bekommen ... Prost! –

+3

Benutze Ben Blanks Ansatz. Nicht sicher, was ich dachte (2010) :-) –

0

______Using Python 3.3 und nicht 2.x ________

Ich möchte eine kleine Sache zu Ben Blank Antwort hinzuzufügen.

from urllib.parse import quote,unquote,urlparse 
u=unquote(u) #u= URL e.g. http://twitter.co.uk/hello/there 
g=urlparse(u) 
u=g.netloc 

Inzwischen, ich habe gerade den Domain-Namen von urlparse.

Um die Subdomains zu entfernen, müssen Sie zunächst wissen, welche Domains auf oberster Ebene sind und welche nicht. Z.B. in der obigen http://twitter.co.uk - co.uk ist eine TLD, während in http://sub.twitter.com haben wir nur .com als TLD und sub ist eine Subdomäne.

Also, wir müssen eine Datei/Liste, die alle tlds hat.

tlds = load_file("tlds.txt") #tlds holds the list of tlds

hostname = u.split(".") 
if len(hostname)>2: 
    if hostname[-2].upper() in tlds: 
     hostname=".".join(hostname[-3:]) 
    else: 
     hostname=".".join(hostname[-2:]) 
else: 
    hostname=".".join(hostname[-2:]) 
5

Allgemeine Struktur der URL:

scheme://netloc/path;parameters?query#fragment

Als TIMTOWTDI Motto:

Mit urlparse,

>>> from urllib.parse import urlparse # python 3.x 
>>> parsed_uri = urlparse('http://www.stackoverflow.com/questions/41899120/whatever') # returns six components 
>>> domain = '{uri.netloc}/'.format(uri=parsed_uri) 
>>> result = domain.replace('www.', '') # as per your case 
>>> print(result) 
'stackoverflow.com/' 

tldextract Mit,

>>> import tldextract # The module looks up TLDs in the Public Suffix List, mantained by Mozilla volunteers 
>>> tldextract.extract('http://forums.news.cnn.com/') 
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com') 

in Ihrem Fall:

>>> extracted = tldextract.extract('http://www.techcrunch.com/') 
>>> '{}.{}'.format(extracted.domain, extracted.suffix) 
'techcrunch.com' 

tldextract on the other hand knows what all gTLDs [Generic Top-Level Domains] and ccTLDs [Country Code Top-Level Domains] look like by looking up the currently living ones according to the Public Suffix List. So, given a URL, it knows its subdomain from its domain, and its domain from its country code.

Cheerio!:)

2

Folgende Skript ist nicht perfekt, kann aber für Anzeige/Verkürzung verwendet werden. Wenn Sie wirklich irgendwelche Abhängigkeiten von Drittanbietern vermeiden wollen oder müssen - insbesondere wenn Sie einige Tld-Daten aus der Ferne abrufen und zwischenspeichern, kann ich Ihnen vorschlagen, das Skript zu befolgen, das ich in meinen Projekten verwende. Es verwendet die letzten beiden Teile der Domain für die meisten gängigen Domain-Erweiterungen und hinterlässt die letzten drei Teile für den Rest der weniger bekannten Domain-Extensions. Im schlimmsten Fall wird Szenario Domain drei Teilen statt zwei haben:

from urlparse import urlparse 

def extract_domain(url): 
    parsed_domain = urlparse(url) 
    domain = parsed_domain.netloc or parsed_domain.path # Just in case, for urls without scheme 
    domain_parts = domain.split('.') 
    if len(domain_parts) > 2: 
     return '.'.join(domain_parts[-(2 if domain_parts[-1] in { 
      'com', 'net', 'org', 'io', 'ly', 'me', 'sh', 'fm', 'us'} else 3):]) 
    return domain 

extract_domain('google.com')   # google.com 
extract_domain('www.google.com')  # google.com 
extract_domain('sub.sub2.google.com') # google.com 
extract_domain('google.co.uk')  # google.co.uk 
extract_domain('sub.google.co.uk') # google.co.uk 
extract_domain('www.google.com')  # google.com 
extract_domain('sub.sub2.voila.fr') # sub2.voila.fr 
0
def get_domain(url): 
    u = urlsplit(url) 
    return u.netloc 

def get_top_domain(url): 
    u""" 
    >>> get_top_domain('http://www.google.com') 
    'google.com' 
    >>> get_top_domain('http://www.sina.com.cn') 
    'sina.com.cn' 
    >>> get_top_domain('http://bbc.co.uk') 
    'bbc.co.uk' 
    >>> get_top_domain('http://mail.cs.buaa.edu.cn') 
    'buaa.edu.cn' 
    """ 
    domain = get_domain(url) 
    domain_parts = domain.split('.') 
    if len(domain_parts) < 2: 
     return domain 
    top_domain_parts = 2 
    # if a domain's last part is 2 letter long, it must be country name 
    if len(domain_parts[-1]) == 2: 
     if domain_parts[-1] in ['uk', 'jp']: 
      if domain_parts[-2] in ['co', 'ac', 'me', 'gov', 'org', 'net']: 
       top_domain_parts = 3 
     else: 
      if domain_parts[-2] in ['com', 'org', 'net', 'edu', 'gov']: 
       top_domain_parts = 3 
    return '.'.join(domain_parts[-top_domain_parts:])