J'ai un lien tel que http://www.techcrunch.com/ et je voudrais obtenir juste la partie de techcrunch.com du lien. Comment puis-je m'y prendre en python?Obtenir le domaine racine du lien
Répondre
Obtenir le nom d'hôte est assez facile en utilisant urlparse:
hostname = urlparse.urlparse("http://www.techcrunch.com/").hostname
Obtenir le « domaine racine », cependant, va être plus problématique, car il est pas défini dans un sens syntaxique. Quel est le domaine racine de "www.theregister.co.uk"? Que diriez-vous des réseaux utilisant des domaines par défaut? "devbox12" pourrait être un nom d'hôte valide. Une façon de gérer cela serait d'utiliser le Public Suffix List, qui tente de cataloguer les deux domaines de premier niveau réels (par exemple ".com", ".net", ".org") ainsi que les domaines privés utilisé comme TLD (par exemple ".co.uk" ou même ".github.io"). Vous pouvez accéder au PSL de Python en utilisant la bibliothèque publicsuffix2:
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)
Pouvez-vous expliquer comment ce code hostname = ".". join (len (nom d'hôte [-2]) <4 et nom d'hôte [-3:] ou nom d'hôte [-2:]) fonctionne? Merci – Joozty
@Joozty - Les index négatifs commencent à la fin, donc 'hostname [-2]' signifie l'avant-dernière entrée (dans ce cas, le nom d'hôte est divisé par des points). 'foo and bar ou baz' fonctionne un peu comme un ternaire: si" foo "est vrai, retourne" bar "; sinon, retourne "baz". Enfin, 'hostname [-3:]' signifie les trois dernières parties. Tous ensemble, cela signifie "Si l'avant-dernière partie du nom d'hôte est plus courte que quatre caractères, utilisez les trois dernières parties et joignez-les avec des points, sinon prenez seulement les deux dernières parties et joignez-les ensemble." –
Pour une raison quelconque, même après l'installation du module, sur Python 3 j'obtiens 'ImportError: impossible d'importer le nom 'get_public_suffix''. N'a pas pu trouver de réponse en ligne ou dans la documentation, donc juste utilisé "tldextract" au lieu de cela qui fonctionne! Bien sûr, je devais d'abord 'sudo pip3 installer tldextract'. – Nagev
Cela a fonctionné pour mes fins. Je pensais que je le partagerais.
".".join("www.sun.google.com".split(".")[-2:])
Que diriez-vous de tester "www.sun.google.co.uk"? Vous obtiendrez "co.uk" au lieu de "google.co.uk" ... Bravo! –
Ya, utilisez l'approche de Ben Blank. Je ne sais pas ce que je pensais (en 2010) :-) –
______Using Python 3.3 et non 2.x ________
Je voudrais ajouter une petite chose à la réponse de 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
Maintenant, je viens de recevoir le nom de domaine de urlparse.
Pour supprimer les sous-domaines, vous devez d'abord savoir quels sont les domaines de premier niveau et lesquels ne le sont pas. Par exemple. dans le http://twitter.co.uk
ci-dessus - co.uk
est un TLD tandis que dans http://sub.twitter.com
nous avons seulement .com
comme TLD et sub
est un sous-domaine. Donc, nous devons obtenir un fichier/liste qui a tous les 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:])
Structure générale URL:
scheme://netloc/path;parameters?query#fragment
Comme TIMTOWTDI devise:
En utilisant 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/'
En utilisant 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')
dans votre cas:
>>> 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!:)
Le script suivant n'est pas parfait, mais peut être utilisé à des fins d'affichage/raccourcissement. Si vous voulez vraiment éviter les dépendances de tiers - en particulier récupérer et mettre en cache à distance certaines données tld, je peux vous suggérer le script suivant que j'utilise dans mes projets. Il utilise les deux dernières parties du domaine pour les extensions de domaine les plus courantes et laisse les trois dernières parties pour le reste des extensions de domaine moins connues. Dans le pire des cas, le domaine du scénario aura trois parties au lieu de deux:
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
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:])
Cela pourrait faire l'affaire. http://docs.python.org/library/urlparse.html – Eli