2009-05-05 16 views
15

¿Existe alguna forma de programación para encontrar el nombre de dominio de un nombre de host dado?Extraiga el nombre de dominio de un nombre de host

dada -> www.yahoo.co.jp retorno -> yahoo.co.jp

El enfoque que funciona, pero es muy lento es: ""

dividida en y elimine 1 grupo de la izquierda, únase y consulte un registro SOA usando dnspython cuando se devuelve un registro SOA válido, considere que un dominio

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

+0

que no siempre va a funcionar bien aunque debido a múltiples subdominios: sample.sample2.yahoo.com.jp –

+0

@Micky McQuade: Si se hace en un bucle, es la única forma de localizar el nombre de dominio. –

+1

Su algoritmo es razonable. Pero arregle su terminología: www.yahoo.co.jp * es * un nombre de dominio, así como también un nombre de host. Usted está buscando la * zona *. – bortzmeyer

Respuesta

3

Se puede utilizar en lugar de partitionsplit:

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

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

+1

La cadena siempre será un dominio válido, pero nada garantiza que será una zona. – bortzmeyer

15

No existe una definición trivial de qué "nombre de dominio" es el padre de un "nombre de host" en particular.

Su método actual de recorrer el árbol hasta que vea un registro SOA es realmente el más correcto.

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

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

Como alternativa, utilice las listas de dominios centrados en delegaciones mantenidas centralmente desde http://publicsuffix.org/, pero tenga en cuenta que estas listas pueden estar incompletas y/o desactualizadas.

Ver también this question donde todo esto se ha ido antes ...

+0

¿Puedes explicar la pregunta y tu respuesta? No estoy seguro de lo que está pasando. – Unknown

+1

Una _zone_ tiene que tener un registro SOA, pero puede tener muchos niveles de "etiqueta" debajo de una zona. Si tiene a.b.c.d.example.com, la única forma de saber que la zona real es un ejemplo.com es quitar cada etiqueta por turno hasta que encuentre un registro SOA. – Alnitak

1

Su algoritmo es la correcta. Dado que los cortes de zona son no reflejados en el nombre de dominio (usted ve los cortes de dominio - los puntos - pero no los cortes de zona), es el único correcto.

Un algoritmo aproximado consiste en utilizar una lista de zonas, como la mencionada por Alnitak. Recuerde que estas listas estáticas no tienen autoridad, carecen de muchos registros, que son rancio, etc.

-2

Aunque no en Python, usted podría puerto este código: http://pastebin.com/raw.php?i=VY3DCNhp

+0

Este código no parece correcto, se basa en una lista estática incorrecta y sin mantenimiento (y la terminología es confusa -LTLD no se usa correctamente- e incluso los comentarios no coinciden con el código - http://blah.co/blah. php = "localhost") – bortzmeyer

Cuestiones relacionadas