1

我正在解析从链接列表返回的 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 语句,然后将异常子句执行到无穷大。

一旦引发异常,我怎样才能让它移动到下一个链接

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

4

2 回答 2

2

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

每当您遇到异常时,该cntr变量都不会更新,这可能会给您留下您最终陷入异常循环的印象。cntr += 1移出try:语句,或用于为enumerate()您生成计数器。

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

于 2013-11-11T15:47:27.967 回答
1

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

于 2013-11-11T15:52:53.657 回答