簡體   English   中英

Python XML解析掛起?

[英]Python XML Parse Hang?

編輯:

我有一個腳本,用於解析站點地圖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

然后什么也不會輸出,並且我的程序將掛起,並且在最后的解析輸出下未終止。 這個網絡有關系嗎? 任何想法/補救措施將不勝感激!

在函數開始時,在調用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'
...

我尚未對此進行測試,所以請告訴我您的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM