我正在使用来自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
答案 0 :(得分:0)
根据文档,close()
方法执行此操作:
强制处理所有缓冲数据,就好像它后跟一个文件结束标记一样。
你仍然在handle_starttag
里面并且还没有使用缓冲区,所以你肯定要不想要处理所有缓冲的数据 - 那& #39;为什么你会遇到递归问题。您无法从机器内部停止机器。
从reset()
的描述中,这听起来更像是你想要的:
重置实例。丢失所有未处理的数据。
但是也不能从它调用的东西中调用它,所以这也显示了递归。
听起来你有两个选择:
引发异常(例如StopIteration
)并从您对解析器的调用中捕获它。根据您在解析中所执行的其他操作,这可能会保留您所需的信息。您可能需要进行一些检查才能看到文件没有打开。
使用简单的旗帜(True
/ False
)来表示您是否已中止。在handle_starttag
的最开始,如果中止则退出。所以机器仍然会通过html的所有标签,但每个标签都不做任何事情。显然,如果你正在处理handle_endtag
,那么这也会检查标志。您可以在收到<html>
标记或覆盖feed
方法时将标记恢复正常。