Python HTMLParser-停止解析

dev*_*ull 5 html python dom

我正在使用Python的HTMLParserfrom html.parser模块。我正在寻找一个标签,当它被发现时,停止解析就很有意义。这可能吗?我试图打电话给我,close()但是我不确定这是不是要走的路。

class MyHTMLParser(HTMLParser):

    def handle_starttag(self, tag, attrs):
        login_form = False
        if tag == "form":
            print("finished")
            self.close()
Run Code Online (Sandbox Code Playgroud)

但是,这似乎具有以结尾的递归效果

  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
Run Code Online (Sandbox Code Playgroud)

小智 2

根据文档,该close()方法执行以下操作:

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

你仍然在里面handle_starttag并且还没有完成缓冲区的工作,所以你肯定不想处理所有缓冲的数据 - 这就是你陷入递归的原因。您无法从机器内部停止机器。

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

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

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

听起来你有两个选择:

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

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