Извлечь доменное имя из имени хоста - PullRequest
16 голосов
/ 05 мая 2009

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

дано -> www.yahoo.co.jp возврат -> yahoo.co.jp

Подход, который работает, но очень медленный:

разделить на "." и удалите 1 группу слева, присоединитесь и запросите запись SOA, используя dnspython когда верная запись SOA возвращается, считается, что домен

Есть ли более чистый / быстрый способ сделать это без использования регулярных выражений?

Ответы [ 3 ]

15 голосов
/ 06 мая 2009

Нет тривиального определения того, какое «доменное имя» является родительским для любого конкретного «имени хоста».

Ваш текущий метод обхода дерева до тех пор, пока вы не увидите SOA запись, на самом деле является наиболее правильным.

Технически, то, что вы делаете там, - это обнаружение «сокращения зоны», и в подавляющем большинстве случаев это будет соответствовать точке, в которой домен был делегирован от его TLD.

Любой метод, основанный на простом синтаксическом анализе имени хоста без ссылки на DNS, обречен на неудачу.

Либо используйте централизованно поддерживаемые списки доменов, ориентированных на делегирование, начиная с http://publicsuffix.org/,, но имейте в виду, что эти списки могут быть неполными и / или устаревшими.

См. Также этот вопрос , где все это было пройдено раньше ...

3 голосов
/ 05 мая 2009

Вы можете использовать partition вместо split:

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

Это поможет с анализом, но, очевидно, не будет проверять, является ли возвращенная строка допустимым доменом.

1 голос
/ 06 мая 2009

Ваш алгоритм правильный. Поскольку срезы зон не отражены в имени домена (вы видите срезы доменов - точки - но не срезы зон), это единственно правильный вариант.

Алгоритм приблизительный состоит в использовании списка зон, подобного тому, который упоминает Альнитак. Помните, что эти статические списки не являются авторитетными, им не хватает многих реестров, они устарели и т. Д.

...