2014-07-11 116 views
0

我需要驗證Python中的url並確保host/netloc組件是域名或ip v4/v6地址。Python - 驗證網址爲域名或IP地址

大多數StackOverflow Q &正如在這個一般的話題說「只使用urlparse」。這不適用於這種情況。

我已經使用urlparse來驗證我確實有一個url。

問題是我需要進一步從urlparse驗證.netloc以確保我獲得域名或IP地址,而不僅僅是主機名。

讓我說明:

>>> from urlparse import urlparse 

這將按預期/期望:

>>> ## domain name 
>>> print urlparse("http://example.com").netloc 
example.com 

>>> ## ipv4 
>>> print urlparse("http://255.255.255.255").netloc 
255.255.255.255 

>>> ## acceptable hostname 
>>> print urlparse("http://localhost").netloc 
localhost 

但我經常碰到錯別字,將讓了錯誤的URL漏網之魚。有人可能會錯過一個'。'在一個域名:

>>> ## valid hostname, but unacceptable 
>>> print urlparse("http://examplecom").netloc 
examplecom 

examplecom確實是一個有效的主機名,並在網絡上可能存在,但它不是一個有效的域名。

還有似乎並沒有強制執行的IP任何規則地址:

>>> print urlparse("http://266.266.266.266").netloc 
266.266.266.266 

>>> print urlparse("http://999.999.999.999.999").netloc 
999.999.999.999.999 
+0

'http:// 999.999.999.999.999'是一個有效的地址。如果您想查看是否存在域,則可以執行DNS查找。 http://stackoverflow.com/questions/2805231/how-can-i-do-dns-lookups-in-python-including-referring-to-etc-hosts – drum

+0

'999.999.999.999.999'不是一個有效的地址根據我在第一句中提到的ipv4或ipv6標準。 –

回答

3

我想這你想要做什麼:

import socket 
def good_netloc(netloc): 
    try: 
     socket.gethostbyname(netloc) 
     return True 
    except: 
     return False 

print good_netloc("google.com") 
print good_netloc("googlecom") 
print good_netloc("10.1.1.1") 
print good_netloc("999.999.999.999") 

這段代碼的輸出是:

lap:~$ python tmp.py 
True 
False 
True 
False 
+0

謝謝。這可以在許多情況下完成工作,但不是全部。 'socket.gethostbyname'取決於DNS查找,所以計算機必須連接到互聯網。它也驗證給定的域名有一個活躍的DNS記錄 - 所以「曾經活躍」或「未來」域名全部失敗(即'example.com'通過,但'foo.example.com'失敗) –

+0

它使用分辨率順序,因此它顯示名稱當前是否有效。 (如果您將主機添加到/ etc/hosts文件中,它將使用該主機。)我不確定我是否按照您對「曾經活躍或未來」的評論。你是否說你想讓它返回True,以表示*可能*(但不一定是當前)有效的DNS名稱? –