2015-02-11 72 views
1

我正在創建一個python應用程序,我從互聯網上下載rss內容列表。我有一個我需要下載的10個url的列表。下載python中的rss內容

我使用python提供的urllib2庫。我使用的代碼是:

for url in urls: 
    rssObject = urllib2.urlopen(url) 
    data = rssObject.read() 
    with open(self.SERVER_PATH+"\\feeds\\"+str(feedID)+str(extension), "w") as requiredData: 
     requiredData.write(str(data)) 
    requiredData.close() 

這裏的第一個URL下載,但在下載下一個URL我得到一個錯誤:

<urlopen error [Errno 66] unknown> 

是否有任何事件,可以通知我要完成下載第一個URL?或者有什麼其他方法可以幫助我避免這個問題?

在此先感謝。

回答

1

是否有任何事件可以通知我完成第一個URL的下載?

引發例外是通知URL無法下載。

或者有沒有其他方法可以幫助我避免這個問題?

是的,你可以發現異常。

try: 
    rssObject = urllib2.urlopen(url) 
    data = rssObject.read() 
except URLError: 
    # do stuff which handles the error 

我不能完全肯定這是你需要捕捉的錯誤,但希望你有能力制定出抓什麼(如果它不是URLError)。

+0

即將回答幾乎相同的事情。我認爲他複製了錯誤信息,但沒有在回溯中打印的異常名稱。正如你所說的那樣,這個異常很可能是'URLError',所以你的代碼應該抓住它。至於66,我還沒有找到那個錯誤。 – 2015-02-11 05:22:39

+0

@Gaurang:如果你想知道爲什麼會發生這種情況,你可以嘗試打印異常的'reason'屬性。 – 2015-02-11 05:24:06

+0

我也在谷歌上搜索過它,但沒有關於錯誤66的信息。另外,錯誤中顯示的描述顯示未知。 – Gaurang 2015-02-11 05:25:03

0

作爲後續約翰眉的回答,和閱讀您的意見後,你可以嘗試類似如下:

def complete_urlopen(url): 
    complete = False 
    while not complete: 
     try: 
      obj = urllib2.urlopen(url) 
      complete = True 
     except URLError, e: 
      pass 
    return obj.read() 

然後通過更換使用它:

rssObject = urllib2.urlopen(url) 
data = rssObject.read() 

與:

data = complete_urlopen(url) 

請注意,此代碼假定urlopen()最終會su cceed。如果它永遠不會,你的過程將永遠掛在那個循環中。這個更復雜的版本可能會考慮最大數量的迭代,這樣當它們到達時,流程就會退出。