Извлечение имени домена из имени хоста
Существует ли программный способ найти доменное имя из заданного имени хоста?
данный → www.yahoo.co.jp
return → yahoo.co.jp
Подход, который работает, но очень медленный:
разделить на "." и удалите 1 группу слева, присоединитесь и запросите запись SOA, используя dnspython
когда возвращается действительная запись SOA, учтите, что домен
Есть ли более чистый/более быстрый способ сделать это без использования регулярных выражений?
Ответы
Ответ 1
Нет никакого тривиального определения того, какое "доменное имя" является родительским элементом какого-либо конкретного "имени хоста".
Ваш текущий метод обхода дерева до тех пор, пока вы не увидите запись SOA
, на самом деле является наиболее правильным.
Технически, то, что вы там делаете, это поиск "зоны разреза", и в подавляющем большинстве случаев это будет соответствовать точке, в которой домен был делегирован из своего TLD.
Любой метод, основанный на простом анализе текста имени узла без ссылки на DNS, обречен на провал.
В качестве альтернативы используйте списки поддерживаемых централизованно ориентированных доменов из http://publicsuffix.org/, но будьте осторожны, что эти списки могут быть неполными и/или устаревший.
См. также этот вопрос, где все это прошло раньше...
Ответ 2
Вы можете использовать partition
вместо split
:
>>> 'www.yahoo.co.jp'.partition('.')[2]
'yahoo.co.jp'
Это поможет с разбором, но, очевидно, не будет проверять, является ли возвращаемая строка допустимым доменом.
Ответ 3
Ваш алгоритм правильный. Поскольку разрезы зоны не отражены в имени домена (вы видите, что разрезы домена - точки, но не разрезы зоны), это единственный правильный.
Алгоритм приближенного состоит в том, чтобы использовать список зон, как, например, Alnitak. Помните, что эти статические списки не являются авторитетными, им не хватает многих реестров, они устарели и т.д.
Ответ 4
Пока не в Python, вы можете перенести этот код: http://pastebin.com/raw.php?i=VY3DCNhp