Python HTMLParser - 停止解析

时间:2015-05-17 08:46:00

标签: python html dom

我正在使用来自HTMLParser模块的Python html.parser。 我正在寻找一个标签,当它被发现时,停止解析是有意义的。这可能吗?我试着打电话给close(),但我不确定这是否可行。

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        login_form = False
        if tag == "form":
            print("finished")
            self.close()

然而,这似乎具有以

结尾的递归效果
  File "/usr/lib/python3.4/re.py", line 282, in _compile
    p, loc = _cache[type(pattern), pattern, flags]
RuntimeError: maximum recursion depth exceeded in comparison

1 个答案:

答案 0 :(得分:0)

根据文档,close()方法执行此操作:

  

强制处理所有缓冲数据,就好像它后跟一个文件结束标记一样。

你仍然在handle_starttag里面并且还没有使用缓冲区,所以你肯定要想要处理所有缓冲的数据 - 那& #39;为什么你会遇到递归问题。您无法从机器内部停止机器。

reset()的描述中,这听起来更像是你想要的:

  

重置实例。丢失所有未处理的数据。

但是也不能从它调用的东西中调用它,所以这也显示了递归。

听起来你有两个选择:

  • 引发异常(例如StopIteration)并从您对解析器的调用中捕获它。根据您在解析中所执行的其他操作,这可能会保留您所需的信息。您可能需要进行一些检查才能看到文件没有打开。

  • 使用简单的旗帜(True / False)来表示您是否已中止。在handle_starttag的最开始,如果中止则退出。所以机器仍然会通过html的所有标签,但每个标签都不做任何事情。显然,如果你正在处理handle_endtag,那么这也会检查标志。您可以在收到<html>标记或覆盖feed方法时将标记恢复正常。