Holen Sie Root-Domain von Link-
Frage
Ich habe einen Link wie http://www.techcrunch.com/ und ich möchte nur den techcrunch.com Teil der Verbindung erhalten. Wie gehe ich über diese in Python?
Lösung
Getting die Hostnamen ist leicht genug, um mit urlparse :
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
gibt es die „Root-Domain“, jedoch wird mehr als problematisch, weil es nicht in syntaktischen Bereich definiert ist. Was ist die Root-Domain von „www.theregister.co.uk“? Wie über Netzwerke Standard Domains verwenden? "Devbox12" könnte ein gültiger Hostname sein.
Eine Möglichkeit, dies zu handhaben wäre, die öffentlichen Suffixliste , der Versuche sowohl echtes Top-Level zum Katalog Domains (zB ".com", ".net", ".org ") sowie private Domänen, die sind verwendet wie TLDs (zB" .de" oder sogar“.github.io „). Sie können die PSL aus Python Zugriff mit der 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)
Andere Tipps
Allgemeine Struktur der URL:
Schema: // Netloc / path; Parameter Abfrage # Fragment
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/'
Mit tldextract ,
>>> 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
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 nach dem öffentlichen Suffix aufzuzublicken Liste. Also, eine URL angegeben, es kennt seine Sub-Domain von seiner Domäne, und seine Domäne von seinem Ländercode.
Cheerio! :)
Skript Nach ist nicht perfekt, aber für die Anzeige / Verkürzung Zwecke verwendet werden. Wenn Sie wirklich wollen / müssen alle 3rd-Party-Abhängigkeiten vermeiden - vor allem Fern Abrufen und Caching einige TLD Daten, die ich Ihnen folgende Skript vorschlagen kann, die ich in meinen Projekten verwenden. Es nutzt beiden letzten Teile der Domain für die meisten gängigen Domain-Endungen und Blätter letzten drei Teile für Rest der weniger bekannten Domain-Endungen. Im schlimmsten Fall wird Szenario Domain drei Teile hat statt zwei:
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
______ Verwendung von 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
Mit dem jetzt, ich habe nur die Domain-Namen von urlparse .
die Subdomains entfernen Sie zunächst alle müssen wissen, welche Top Level Domains und welche nicht. Z.B. in der obigen http://twitter.co.uk
- co.uk
ist eine TLD während in http://sub.twitter.com
wir nur .com
als TLD haben und sub
ist eine Sub-Domain
Wir brauchen also eine Datei / Liste zu erhalten, die alle den tlds .
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:])
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:])
Das funktionierte für meine Zwecke. Ich dachte, ich würde Aktie.
".".join("www.sun.google.com".split(".")[-2:])