陷入异常循环

时间:2013-11-11 15:44:24

标签: python html parsing

我正在解析从链接列表返回的HTML。当我在每个HTML文档中达到某一点时,我会引发异常。

import urllib2, time, 
from HTMLParser import HTMLParser

class MyHTMLParser2(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if somethings:
            do somethings
        if tag == "div" and "section2" in attrs[0][1]:
            raise NameError('End')

parser2 = MyHTMLParser2()
cntr = 0
for links in ls:
    try:
        f = urllib2.urlopen(links)
        parser2.feed(f.read())
        cntr+=1
        if cntr%10 == 0:
            print "Parsing...", "       It has benn", (time.clock()-start)/60, 'mins.'
            break

    except Exception, e:
        print 'There has been an error Jim.    url_check number', cntr
        error_log.write(links)
        continue

它只对第一个链接执行一次try语句,然后将exception子句执行到无穷大。

一旦引发异常,如何让它转到下一个链接

error_log来自与urllib2相关的其他一些错误,大多数情况下它们似乎无法足够快地连接到网页。因此,如果有一种方法可以在不抛出异常的情况下退出HTMLParser2,那就太棒了。这样我就可以重新实现error_log

2 个答案:

答案 0 :(得分:2)

不,你的诊断不正确,这里没有无限的异常循环。每个URL都是完全独立的例外。

每当您遇到异常时,cntr变量都不会更新,这可能会为您提供最终在异常循环中结束的展示。移动cntr += 1语句的try: ,或使用enumerate()为您生成计数器。

那就是说,为什么要尝试使用一个解析器实例解析多个HTML页面?很可能你遇到的异常是特定页面格式错误并将解析器置于无法继续的状态。

答案 1 :(得分:1)

您不应该因异常而停止解析器。解析是一个非常复杂的过程,通常,最好让解析器完成,收集所需的信息,并在解析器完成它的工作时处理这些信息。这样,您可以将软件中的不同内容分开,使一切更易于维护,调试和理解。