Python HTMLParser - 停止解析

5

我正在使用Python的html.parser模块中的HTMLParser。 我正在寻找一个单一的标签,当找到它时停止解析会很有意义。 这可行吗? 我尝试调用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

似乎您应该调用父类 HTMLParser 的 close 方法,但解释器无法解决对该方法的引用。我很好奇为什么这不起作用。 - user4745703
可能是重复的问题:如何告诉Python HTMLParser停止解析 - Fraser
1个回答

2
根据文档,close()方法的作用是:
强制处理所有缓冲数据,就好像它后面有一个文件结束标记一样。
你仍然在handle_starttag中,并且还没有完成对缓冲区的操作,所以绝对不要处理所有缓冲数据 - 这就是为什么你会被递归卡住。你不能从机器内部停止机器。
reset()的描述中看,这更像是你想要的:
重置实例。失去所有未处理的数据。
但是,这也不能从它调用的东西中调用,因此这也显示了递归。
听起来你有两个选择:
1.引发异常(例如StopIteration),并从解析器的调用中捕获它。根据您在解析中执行的其他操作,这可能会保留您需要的信息。您可能需要进行一些检查,以确保不会留下打开的文件。
2.使用一个简单的标志(True / False)来表示您是否已中止。在handle_starttag的开头,如果已中止,则立即退出。因此,机器将仍然遍历html的所有标签,但对每个标签都不执行任何操作。显然,如果您还处理handle_endtag,则它也会检查标志。您可以通过接收<html>标记或覆盖feed方法来将标志设置回正常状态。

能否用简短的代码片段解释一下解决方案?@康斯坦斯 - Sidrah Madiha Siddiqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接