Извлечение имени домена из имени хоста

Существует ли программный способ найти доменное имя из заданного имени хоста?

данный → 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. Помните, что эти статические списки не являются авторитетными, им не хватает многих реестров, они устарели и т.д.