Код Python, чтобы определить, существует ли TLD, запросить еще раз, если нет?

Это дополнительный вопрос в отношении этого сообщения: Python raw_input с принудительным TLD?

У меня есть проверка, чтобы увидеть, заканчивается ли строка на TLD,

TLD = ('.com', '.info', '.org', '.net')
if raw_input("Please enter a hostname").endswith(TLD):
# blah blah

Но я пытаюсь сохранить raw_input в переменной. Будет ли правильной практикой кодирования делать что-то вроде:

TLD = ('.com', '.info', '.org', '.net')
hostName = raw_input(":").lower()
<<piece of code that determines if hostName does in fact end with a TLD?>>

Если да, то как это будет выглядеть? Я попытался некоторое время True: и оператор if elif, но я ничего не получаю, я бесконечно гуглил безрезультатно, поэтому я размещаю этот вопрос здесь.

Рассматриваемая программа захватит имя хоста, скажем, google.com, определит, есть ли у него действительный TLD, удалит TLD off от hostName и сохранит его в hostNameshort (оба будут использоваться позже), если он снова не получает правильное приглашение TLD с акцентом на то, что ему нужен TLD во время ввода, а затем продолжает, как только это произойдет.


person Community    schedule 29.05.2013    source источник


Ответы (2)


Что-то вроде этого:

TLD = ('.com', '.info', '.org', '.net')
hostName = raw_input(":").lower()
while not hostName.endswith(TLD):
    print "Incorrect input, Try again!"
    hostName = raw_input(":").lower()

Демо:

:foo.bar
Incorrect input, Try again!
:google.in
Incorrect input, Try again!
:yahoo.com
person Ashwini Chaudhary    schedule 29.05.2013

Фактический поиск DNS для проверки TLD

О, пока мы этим занимаемся, может быть, короткий фрагмент для фактического тестирования TLD на DNS-серверах может оказаться удобным. Я использую модуль dnspython от ребят Nominum:

import dns.resolver

def testTLD(tld):
    try:
        dns.resolver.query(tld + '.', 'SOA')
        return True
    except dns.resolver.NXDOMAIN:
        return False

for tld in ('com', 'org', 'klonk', 'dk'):
    print "TLD \"{tld}\" exists: {bool}".format(tld=tld, bool=testTLD(tld))

и работает так:

TLD "com" exists: True
TLD "org" exists: True
TLD "klonk" exists: False
TLD "dk" exists: True
person mogul    schedule 29.05.2013
comment
Пожалуйста. Если это действительно работает для вас, проголосуйте за него, тогда другим будет легче найти фрагмент. (и мой репутационный блуд получит еще один тик :-) - person mogul; 30.05.2013