Extraer el nombre de dominio de un nombre de host

¿Hay una manera programática de encontrar el nombre de dominio de un nombre de host dado?

dado -> www.yahoo.co.jp volver -> yahoo.co.jp

El enfoque que funciona pero es muy lento es:

dividido en “.” y elimine 1 grupo de la izquierda, únase y consulte un registro SOA usando dnspython cuando se devuelva un registro SOA válido, considere que un dominio

¿Hay una manera más limpia / rápida de hacer esto sin usar expresiones regulares?

    No hay una definición trivial de qué “nombre de dominio” es el padre de cualquier “nombre de host” en particular.

    Su método actual para atravesar el árbol hasta que vea un registro SOA es en realidad el más correcto.

    Técnicamente, lo que está haciendo allí es encontrar un “corte de zona” y, en la gran mayoría de los casos, corresponderá al punto en el que el dominio fue delegado de su TLD.

    Cualquier método que se base en el mero análisis de texto del nombre de host sin hacer referencia al DNS está condenado al fracaso.

    Alternativamente, haga uso de las listas mantenidas centralmente de dominios centrados en la delegación de http://publicsuffix.org/ , pero tenga en cuenta que estas listas pueden estar incompletas o desactualizadas.

    Vea también esta pregunta donde todo esto ha sido revisado antes …

    Puedes usar la partition lugar de split :

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

    Esto ayudará con el análisis, pero obviamente no comprobará si la cadena devuelta es un dominio válido.

    Tu algoritmo es el correcto. Dado que los cortes de zona no se reflejan en el nombre de dominio (usted ve cortes de dominio – los puntos – pero no cortes de zona), es el único correcto.

    Un algoritmo aproximado es usar una lista de zonas, como la que menciona Alnitak. Recuerde que estas listas estáticas no tienen autoridad, carecen de muchos registros, están obsoletas, etc.