【问题标题】:Stuck in an Exception loop陷入异常循环
【发布时间】:2013-11-11 15:44:23
【问题描述】:

我正在解析从链接列表返回的 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

【问题讨论】:

  • 你能打印回溯吗?
  • 只捕获Exception 是个坏主意,因为这会导致您忽略意外错误。仅捕获最具体的异常类型,并且仅在您确实有理由捕获它的情况下。

标签: python html parsing


【解决方案1】:

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

cntr 变量不会在您遇到异常时更新,也许这会给您带来印象,您最终会陷入异常循环。将try: 语句的cntr += 1移出,或者使用enumerate() 为您生成一个计数器。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为你可能是对的。虽然我有循环在下一个链接上移动,但解析器似乎卡在第一个链接上,因为它只从第一个链接返回我想要的信息。我想如果我让解析器提前退出,我可以节省几个小时的解析时间。但是我需要几个小时才能弄清楚如何让它正确地做到这一点。我的也让它跑过去。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2019-11-12
    • 2017-03-05
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多