Мне удалось найти решение. В игре было несколько вещей:
Роб.
Вы можете использовать раздел
вместо split
:
>>> 'www.yahoo.co.jp'.partition('.')[2]
'yahoo.co.jp'
Это поможет с анализом, но, очевидно, не будет проверять, является ли возвращенная строка действительный домен.
Нет тривиального определения того, какое «доменное имя» является родительским для какого-либо конкретного «имени хоста».
Ваш текущий метод обхода дерева до тех пор, пока вы не увидите SOA
запись на самом деле является наиболее правильной.
С технической точки зрения, то, что вы делаете там, - это нахождение "среза зоны", и в подавляющем большинстве случаев это будет соответствовать точке, в которой домен был делегирован из его TLD.
Любой метод, основанный на простом текстовом синтаксическом анализе имени хоста без ссылки на DNS, обречен на неудачу.
В качестве альтернативы можно использовать централизованно поддерживаемые списки доменов, ориентированных на делегирование, из http: //publicsuffix.org/, но помните, что эти списки могут быть неполными и / или устаревшими.
См. Также этот вопрос , где все это было пропущено раньше ...
Ваш алгоритм правильный. Поскольку сокращения зоны не отражаются в доменном имени (вы видите сокращения доменов - точки - но не сокращения зон), это единственно правильный алгоритм.
Примерный алгоритм состоит в том, чтобы использовать список зон, наподобие упомянутой Альнитаком. Помните, что эти статические списки не являются авторитетными, в них не хватает многих реестров, они устарели и т. Д.