Python HTMLParser-停止解析
我正在使用Python的Python HTMLParser-停止解析,python,html,dom,Python,Html,Dom,我正在使用Python的html.parser模块中的HTMLParser。 我正在寻找一个标记,当找到它时,停止解析是有意义的。这可能吗?我试图调用close(),但我不确定这是否是正确的方法 class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): login_form = False if tag == "form": print("fini
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
根据文档,
close()
方法执行以下操作:
强制处理所有缓冲数据,就像它后面有一个文件结束标记一样
您仍然在句柄\u starttag
中,并且还没有完成缓冲区的工作,因此您肯定不希望处理所有缓冲数据-这就是为什么您一直使用递归的原因。你不能从机器内部停止机器
从reset()
的描述来看,这听起来更像您想要的:
重置实例。丢失所有未处理的数据
但这也不能从它调用的东西调用,所以这也显示了递归
听起来你有两个选择:
- 引发异常(例如
)并从对解析器的调用中捕获它。根据您在解析过程中执行的其他操作,这可能会保留您需要的信息。您可能需要进行一些检查,以查看文件是否处于打开状态StopIteration
- 使用一个简单的标志(
/True
)表示您是否已中止。在False
的一开始,如果中止,只需退出即可。因此,机器仍然会遍历html的所有标记,但不会对每个标记执行任何操作。显然,如果您也在处理handle\u starttag
,那么这也会检查标志。您可以在收到handle\u endtag
标记时或通过覆盖
方法将标志设置回正常提要