我正在使用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。