Here is one test for problem with not calling targets' close() method when XMLSyntaxError is raised during SAX-like parsing even with recover=True. This is addition to test_htmlparser.py: def test_module_target_on_raise_stop(self): class Target(object): def __init__(self, res): self.res = res def start(self, tag, attrib): pass def end(self, tag): pass def close(self): self.res.append(True) result = [] parser = self.etree.HTMLParser(target=Target(result), recover=True) parse = self.etree.parse f = BytesIO(self.broken_html_str) self.assertRaises(self.etree.XMLSyntaxError, parse, f, parser) self.assertEqual(result[-1],True)