Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python HTMLParser-停止解析_Python_Html_Dom - Fatal编程技术网

Python HTMLParser-停止解析

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

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

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

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

您仍然在
句柄\u starttag
中,并且还没有完成缓冲区的工作,因此您肯定不希望处理所有缓冲数据-这就是为什么您一直使用递归的原因。你不能从机器内部停止机器

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

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

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

听起来你有两个选择:

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

  • 使用一个简单的标志(
    True
    /
    False
    )表示您是否已中止。在
    handle\u starttag
    的一开始,如果中止,只需退出即可。因此,机器仍然会遍历html的所有标记,但不会对每个标记执行任何操作。显然,如果您也在处理
    handle\u endtag
    ,那么这也会检查标志。您可以在收到
    标记时或通过覆盖
    提要
    方法将标志设置回正常


似乎应该调用父类HTMLParser的close方法,但解释器无法解决对该方法的引用。我很好奇为什么这不起作用。你能用一个粗略的代码片段解释一下这个解决方案吗@康斯坦斯