2015-12-26 103 views
1

編輯:Python XML解析掛起?

我有一個腳本,解析一個站點地圖xml和第一次存儲在數組中。然後設置它,以便刷新,解析並將所需的xml標籤存儲到另一個數組中,以檢查是否有任何差異。第二個陣列在xmls刷新中每3秒不斷更新。然而,它似乎掛起來,我想知道問題是什麼。

import urllib,time 
from time import gmtime, strftime 
from xml.dom import minidom 
url='http://kutoa.com/sitemap_products_1.xml?from=1&to=999999999' 
def main(): 
    primList=[] 
    secList=[] 
    xml = urllib.urlopen(url).read() 
    xmldoc = minidom.parseString(xml) 
    loc_values = xmldoc.getElementsByTagName('loc') 
    for loc_val in loc_values: 
     item=(loc_val.firstChild.nodeValue) 
     primList.append(item) 
    for i in primList: 
     secList.append(item) 
    while len(secList)==len(primList): 
     print str(strftime("%Y-%m-%d %H:%M:%S", gmtime()))+' :: '+str(len(secList)) +' items indexed...' 
     print 'destruct list' 
     secList=[] 
     print 'empty list/reading url' 
     xml = urllib.urlopen(url).read() 
     print 'url read/parsing' 
     xmldoc = minidom.parseString(xml) 
     print 'parsed going for tags' 
      loc_values = xmldoc.getElementsByTagName('loc') 
     print 'adding tags' 
     for loc_val in loc_values: 
      item=(loc_val.firstChild.nodeValue) 
      secList.append(item) 
     print 'tags added to list' 
     time.sleep(3) 
     print 'sleep for 3\n' 
    if len(primList)>len(secList): 
      print 'items removed' 
      main() 
    elif len(secList)>len(primList): 
      print 'items added' 
      main() 
main() 

用打印語句進行故障排除我發現它在打開url時被掛起。下面是最近的一些輸出:

2015-12-26 18:30:21 :: 7 items indexed... 
destruct list 
empty list/reading url 
url read/parsing 
parsed going for tags 
adding tags 
tags added to list 
sleep for 3 

2015-12-26 18:30:24 :: 7 items indexed... 
destruct list 
empty list/reading url 
url read/parsing 
parsed going for tags 
adding tags 
tags added to list 
sleep for 3 

2015-12-26 18:30:27 :: 7 items indexed... 
destruct list 
empty list/reading url 

再沒有什麼更多的將輸出和我的程序將只是掛,未封端的最後解析輸出下。這個網絡是相關的嗎?任何想法/補救措施將不勝感激!

+0

添加更多輸出,以便您可以確定哪條線懸掛。 –

+0

此外,這是一個外部網站?如果是這樣,它可能有一些邏輯,以避免像這樣的重複請求過載。每分鐘只嘗試輪詢。 –

+0

@MartinBonner感謝您的回覆。通過添加一些基本的打印語句進行故障排除,我發現它在這裏陷入了困境:\t \t xml = urllib.urlopen(url).read() –

回答

1

在函數開始之前,在調用urlopen之前,可能需要設置套接字超時以防止該調用可能永久掛起。這個片段將超時時間設置爲3秒的一致性與你的睡眠值:

import socket 

def main(): 
    socket.setdefaulttimeout(3) 
    ... 

然後,換你來urlopen呼叫趕上socket.timeout例外。這段代碼只是打印一個字符串,並繼續你的循環:

try: 
    xml = urllib.urlopen(url).read() 
except socket.timeout as e: 
    print 'timeout reading url: %s' % e 
    continue 
print 'url read/parsing' 
... 

我還沒有測試過,所以讓我知道它是如何爲你服務的。

+0

謝謝!我沒有太多的經驗,但有了這樣的異常處理,我可以繼續。我實現了第一個數組的第一個解析和IOError異常的while循環。 –

+0

由於您在處理異常方面沒有多少經驗,因此我在第二個片段中編寫了一個氣味編輯器,將異常分配給變量「e」,然後將該變量包含在打印的字符串中。在排除像這樣的問題時,您可能會發現它很有用。 – cr3