Ottenere dominio radice di Link
Domanda
ho un link come http://www.techcrunch.com/ e vorrei ottenere solo la parte techcrunch.com del collegamento. Come posso fare per questo in Python?
Soluzione
Come il nome host è abbastanza facile utilizzando urlparse :
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
Ottenere il "dominio principale", invece, sta per essere più problematico, perché non è definita in senso sintattico. Qual è il dominio principale di "www.theregister.co.uk"? Come su reti che utilizzano domini di default? "Devbox12" potrebbe essere un nome host valido.
Un modo per gestire questa situazione potrebbe essere quella di utilizzare il list pubblica suffisso , che cerca di catalogare sia a livello superiore reale domini (ad esempio ".com", ".net", ".org "), così come i domini privati, che sono usati come TLD (ad esempio" .co.uk" o anche" .github.io "). È possibile accedere alla PSL da Python utilizzando il publicsuffix2 libreria:
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)
Altri suggerimenti
La struttura generale del URL:
schema:? // netloc / percorso; i parametri di query # frammento
TIMTOWTDI motto:
Utilizzo 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/'
Utilizzo 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')
nel tuo caso:
>>> extracted = tldextract.extract('http://www.techcrunch.com/')
>>> '{}.{}'.format(extracted.domain, extracted.suffix)
'techcrunch.com'
tldextract
d'altra parte sa quello che tutti i gTLD [ Generic Top-Level Domains ] e ccTLD [ Country Code Top-Level Domains ] assomigliano cercando su quelle che attualmente vivono secondo il suffisso pubblico Elenco. Quindi, dato un URL, si conosce il suo sottodominio dal suo dominio, e la sua dominio dal suo codice paese.
Cheerio! )
A seguito di script non è perfetto, ma può essere utilizzato per la visualizzazione / scopi accorciamento. Se davvero si vuole / necessità di evitare eventuali dipendenze 3a parte - in particolare il recupero e la memorizzazione nella cache alcuni dati tld ti posso suggerire seguente script che uso nei miei progetti da remoto. Esso utilizza ultime due parti del dominio a maggior parte delle estensioni di domini e lascia ultimi tre parti per il riposo delle estensioni di dominio meno conosciuti. Nel peggiore dei casi dominio scenario avrà tre parti invece di due:
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
______ Usare Python 3.3 e non 2.x ________
Vorrei aggiungere una piccola cosa per la risposta di Ben Blank.
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
A questo punto, ho appena ricevuto il nome di dominio da urlparse .
Per rimuovere i sottodomini prima di tutto dovete sapere che sono domini di primo livello e che non sono. Per esempio. nel http://twitter.co.uk
sopra - co.uk
è un dominio di primo livello, mentre in http://sub.twitter.com
abbiamo solo .com
come dominio di primo livello e sub
è un sottodominio
Quindi, abbiamo bisogno di ottenere un file / lista che ha tutte le domini di primo livello .
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:])
Questo ha funzionato per i miei scopi. Ho pensato di condividerlo.
".".join("www.sun.google.com".split(".")[-2:])