2014-10-17 33 views
0

我正在使用以下腳本來加載URL列表,然後檢查每個錯誤字符串列表的來源。如果在源中找不到錯誤字符串,則該URL將被視爲有效並寫入文本文件。如何修改此腳本以檢查HTTP狀態(404,200)

如何修改此腳本來檢查HTTP狀態?如果一個URL返回一個404,它將被忽略,如果它返回200,那麼該URL將被寫入該文本文件。任何幫助將非常感激。

import urllib2 
import sys 

error_strings = ['invalid product number', 'specification not available. please contact customer services.'] 

def check_link(url): 
if not url: 
    return False 
f = urllib2.urlopen(url)  
html = f.read() 
result = False 
if html: 
    result = True 
    html = html.lower() 
    for s in error_strings: 
     if s in html: 
      result = False 
      break 
return result 


if __name__ == '__main__': 
if len(sys.argv) == 1: 
    print 'Usage: %s <file_containing_urls>' % sys.argv[0] 
else: 
    output = open('valid_links.txt', 'w+') 
    for url in open(sys.argv[1]): 
     if(check_link(url.strip())): 
      output.write('%s\n' % url.strip()); 
    output.flush() 
    output.close() 

回答

1

您可以更改您的來電urlopen略:

>>> try: 
...  f = urllib2.urlopen(url) 
... except urllib2.HTTPError, e: 
...  print e.code 
... 
404 

利用e.code,你可以檢查你的404。如果你沒有擊中except區塊,你可以像目前一樣利用f

0

urlib2.urlopen還給其他一些方法,其中一個類文件對象:getcode()是你在找什麼,只是添加一行:

if f.getcode() != 200: 
    return False 

在相關地方

+0

此方法不適用於404s。如果你訪問一個不存在的站點,它會拋出一個異常,然後你可以通過這個方法檢查代碼。 – Andy 2014-10-17 14:24:56

+0

夠公平的,我看了看文檔,發現了一些有用的東西,被誤解了一點。我自己,我在哪裏可以用'request'。 – 2014-10-17 14:38:19

0

試試這個。您可以使用此

def check_link(url): 
     if not url: 
      return False 
     code = None 
     try: 
      f = urllib2.urlopen(url) 
      code = f.getCode() 
     except urllib2.HTTPError, e: 
      code = e.code 
     result = True 
     if code != 200: 
      result = False 
     return result 

另外,如果你只需要保持無效代碼字符串列表和核查一下,它會像下面。

def check_link(url): 
    if not url: 
     return False 
    code = None 
    try: 
     f = urllib2.urlopen(url) 
     code = f.getCode() 
    except urllib2.HTTPError, e: 
     code = e.code 

    result = True 
    if code in invalid_code_strings: 
     result = False 

    return result 
+0

這不起作用。如果你的網址不存在,你的'urlopen'上會出現異常。試試這個代碼的URL爲http:// www.google.com/NOTREAL',並注意引發的urllib2.HTTPError' – Andy 2014-10-17 14:20:02

+0

+1你是對的。非成功狀態代碼似乎通過例外返回。 – govin 2014-10-17 14:22:34