2009-05-05 5 views
15

Existe-t-il un moyen de trouver le nom de domaine à partir d'un nom d'hôte donné?Extraire le nom de domaine à partir d'un nom d'hôte

donné -> www.yahoo.co.jp retour -> yahoo.co.jp

L'approche qui fonctionne, mais est très lent est: ""

fendu sur et supprimer un groupe de la gauche, joindre et interroger un enregistrement SOA en utilisant dnspython lorsqu'un enregistrement SOA valide est renvoyé, considérez qu'un domaine

Existe-t-il un moyen plus propre/plus rapide de faire cela sans utiliser d'expressions rationnelles?

+0

qui ne fonctionne pas toujours, soit bien en raison de multiples sous-domaines: sample.sample2.yahoo.com.jp –

+0

@Micky McQuade: Si c'est fait en boucle, c'est le seul moyen de localiser le nom de domaine. –

+1

Votre algorithme est raisonnable. Mais corrigez votre terminologie: www.yahoo.co.jp * est * un nom de domaine, ainsi qu'un nom d'hôte. Vous cherchez la * zone *. – bortzmeyer

Répondre

3

Vous pouvez utiliser partition au lieu de split:

>>> 'www.yahoo.co.jp'.partition('.')[2] 
'yahoo.co.jp' 

Cela vous aidera avec l'analyse syntaxique mais évidemment pas vérifier si la chaîne retournée est un domaine valide.

+1

La chaîne sera toujours un domaine valide, mais rien ne garantit qu'il s'agira d'une zone. – bortzmeyer

15

Il n'y a pas de définition triviale de quel "nom de domaine" est le parent d'un "nom d'hôte" particulier.

Votre méthode actuelle pour parcourir l'arborescence jusqu'à ce que vous voyiez un enregistrement SOA est réellement la plus correcte.

Techniquement, ce que vous faites là-bas est de trouver une «zone coupée», et dans la grande majorité des cas, cela correspondra au point auquel le domaine a été délégué à partir de son TLD.

Toute méthode qui repose sur une simple analyse de texte du nom d'hôte sans référence au DNS est vouée à l'échec.

Vous pouvez également utiliser les listes centralisées des domaines centrés sur la délégation de http://publicsuffix.org/, mais sachez que ces listes peuvent être incomplètes et/ou obsolètes.

Voir aussi this question où tout cela a été dépassé avant ...

+0

Pouvez-vous expliquer la question et votre réponse? Je ne suis pas sûr de ce qui se passe. – Unknown

+1

Un _zone_ doit avoir un enregistrement SOA, mais vous pouvez avoir plusieurs niveaux de "label" sous une zone. Si vous avez un.b.c.d.example.com, le seul moyen de savoir que la zone réelle est un exemple.com consiste à enlever chaque étiquette à tour de rôle jusqu'à ce que vous trouviez un enregistrement SOA. – Alnitak

1

Votre algorithme est celui de droite. Puisque les coupures de zone sont et non reflétées dans le nom de domaine (vous voyez les coupures de domaine - les points - mais pas les coupures de zone), c'est la seule correcte.

Un algorithme approximatif est d'utiliser une liste de zones, comme celle mentionnée par Alnitak. Rappelez-vous que ces listes ne sont pas statiques faisant autorité, ils manquent de nombreux registres, ils sont obsolètes, etc.

-2

Alors pas en Python, vous pourriez porter ce code: http://pastebin.com/raw.php?i=VY3DCNhp

+0

Ce code ne semble pas correct, il repose sur une liste statique incorrecte et non maintenue (et la terminologie est confuse - TLD n'est pas utilisé correctement - et même les commentaires ne correspondent pas au code - http://blah.co/blah. php = "localhost") – bortzmeyer

Questions connexes