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?

È stato utile?

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:])
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top