web-dev-qa-db-fra.com

Python urlparse - extraire le nom de domaine sans sous-domaine

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?

44
Clay Wardell

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"
57
Gareth Latty

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.

24
Andy

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.

2
sandyp
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

1
Danial Frs

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.

1
Andrea Moro

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'
  • Une fourchette de publicsuffix supposément plus conviviale pour l'emballage.

publicuffixlist:

>>> import publicsuffixlist
>>> publicsuffixlist.PublicSuffixList().privatesuffix('www.google.co.uk')
'google.co.uk'
  • Annonce le support de 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'
  • L'obligation de gérer les mises à jour et de mettre en cache le fichier téléchargé vous-même est un peu compliquée.
0
tripleee