Besoin d'un moyen d'extraire un nom de domaine sans le sous-domaine d'une URL en utilisant Python urlparse.
Par exemple, je voudrais extraire "google.com"
à partir d'une URL complète comme "http://www.google.com"
.
Le plus proche que je puisse sembler venir avec urlparse
est l'attribut netloc
, mais cela inclut le sous-domaine, qui dans cet exemple serait www.google.com
.
Je sais qu'il est possible d'écrire une manipulation de chaîne personnalisée pour transformer www.google.com en google.com, mais je veux éviter les transformations de chaîne à la main ou l'expression régulière dans cette tâche. (La raison en est que je ne connais pas suffisamment les règles de formation d'URL pour être sûr que je pourrais considérer chaque cas Edge requis lors de l'écriture d'une fonction d'analyse personnalisée.)
Ou, si urlparse
ne peut pas faire ce dont j'ai besoin, quelqu'un connaît-il d'autres bibliothèques Python d'analyse d'url qui le feraient?
Vous voudrez probablement vérifier tldextract , une bibliothèque conçue pour faire ce genre de chose.
Il utilise la liste des suffixes publics pour essayer d'obtenir une répartition décente basée sur les gTLD connus, mais notez qu'il ne s'agit que d'une liste de force brute, rien de spécial, de sorte qu'elle peut être obsolète (bien que nous espérons qu'elle soit organisée de manière à ne pas ).
>>> import tldextract
>>> tldextract.extract('http://forums.news.cnn.com/')
ExtractResult(subdomain='forums.news', domain='cnn', suffix='com')
Donc dans votre cas:
>>> extracted = tldextract.extract('http://www.google.com')
>>> "{}.{}".format(extracted.domain, extracted.suffix)
"google.com"
Ceci est une mise à jour, basée sur la demande de prime pour une réponse mise à jour
Commencez par utiliser le package tld . Une description du package:
Extrait le domaine de premier niveau (TLD) de l'URL indiquée. La liste des noms de TLD est extraite de Mozilla http://mxr.mozilla.org/mozilla/source/netwerk/dns/src/effective_tld_names.dat?raw=1
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
print get_tld("http://www.google.co.uk")
print get_tld("http://zap.co.it")
print get_tld("http://google.com")
print get_tld("http://mail.google.com")
print get_tld("http://mail.google.co.uk")
print get_tld("http://google.co.uk")
Cette sorties
google.co.uk
zap.co.it
google.com
google.com
google.co.uk
google.co.uk
Notez qu'il gère correctement les TLD au niveau des pays en laissant co.uk
Et co.it
, Mais supprime correctement les sous-domaines www
et mail
pour les deux .com
et .co.uk
L'appel update_tld_names()
au début du script est utilisé pour mettre à jour/synchroniser les noms tld avec la version la plus récente de Mozilla.
Pour la manipulation des noms de domaine, vous pouvez également utiliser Dnspy
Il permet d'extraire des domaines (et des étiquettes de domaine) à différents niveaux, en utilisant une nouvelle copie de la liste des suffixes publics de Mozilla.
from tld import get_tld
from tld.utils import update_tld_names
update_tld_names()
result=get_tld('http://www.google.com')
print 'https://'+result
Entrée: http://www.google.com
Résultat: google.com
L'utilisation de tldexport fonctionne bien, mais semble avoir un problème lors de l'analyse du sous-domaine blogspot.com et créer un gâchis. Si vous souhaitez continuer avec cette bibliothèque, assurez-vous d'implémenter une condition if ou quelque chose pour éviter de renvoyer une chaîne vide dans le sous-domaine.
Il existe plusieurs modules Python qui encapsulent la (une fois Mozilla) liste publique de suffixes dans une bibliothèque, dont plusieurs ne le font pas requiert que l'entrée soit une URL. Même si la question concerne spécifiquement la normalisation des URL, mon exigence était de gérer uniquement les noms de domaine, et je propose donc une réponse tangentielle pour cela.
Les mérites relatifs de publicsuffix2 sur publicsuffixlist ou publicsuffix ne sont pas clairs, mais ils semblent tous offrir les fonctionnalités de base.
publicsuffix2:
>>> import publicsuffix # sic
>>> publicsuffix.PublicSuffixList().get_public_suffix('www.google.co.uk')
u'google.co.uk'
publicsuffix
supposément plus conviviale pour l'emballage.publicuffixlist:
>>> import publicsuffixlist
>>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk')
'google.co.uk'
idna
, que je n'ai cependant pas testé.publicsuffix:
>>> import publicsuffix
>>> publicsuffix.PublicSuffixList(publicsuffix.fetch()).get_public_suffix('www.google.co.uk')
'google.co.uk'