2009-05-05 5 views
15

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

дано -> www.yahoo.co.jp возвращение -> yahoo.co.jp

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

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

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

+0

, что не всегда будет работать либо хотя из-за нескольких sub domains: sample.sample2.yahoo.com.jp –

+0

@Micky McQuade: Если это сделано в цикле, это единственный способ найти доменное имя. –

+1

Ваш алгоритм является разумным. Но исправьте свою терминологию: www.yahoo.co.jp * - это доменное имя, а также имя хоста. Вы ищете * зону *. – bortzmeyer

ответ

3

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

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

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

+1

Строка всегда будет действительным доменом, но ничто не гарантирует, что это будет зона. – bortzmeyer

15

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

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

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

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

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

Смотрите также this question, где все это было до того перешли ...

+0

Не могли бы вы объяснить вопрос и ответ? Я не уверен, что происходит. – Unknown

+1

A _zone_ должен иметь запись SOA, но вы можете иметь множество уровней «ярлыка» под зоной. Если у вас есть a.b.c.d.example.com, единственный способ узнать, что фактическая зона является примером.com - отменить каждую метку, пока вы не найдете запись SOA. – Alnitak

1

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

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

-2

Хотя не в Python, вы могли бы порт этот код: http://pastebin.com/raw.php?i=VY3DCNhp

+0

Этот код не кажется правильным, он полагается на неверный и незанятый статический список (и терминология путается - TLD не используется должным образом - и даже комментарии не соответствуют коду - http://blah.co/blah. php = "localhost") – bortzmeyer

Смежные вопросы