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?

War es hilfreich?

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:])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top