class_docstr: Find tags and other markup and call handler functions.
  
  Usage:
      p = HTMLParser()
      p.feed(data)
      ...
      p.close()
  
  Start tags are handled by calling self.handle_starttag() or
  self.handle_startendtag(); end tags by self.handle_endtag().  The
  data between tags is passed from the parser to the derived class
  by calling self.handle_data() with the data as argument (the data
  may be split up in arbitrary chunks).  If convert_charrefs is
  True the character references are converted automatically to the
  corresponding Unicode character (and self.handle_data() is no
  longer split in chunks), otherwise they are passed by calling
  self.handle_entityref() or self.handle_charref() with the string
  containing respectively the named or numeric reference as the
  argument.
code: def parse_html_declaration(self, i):
      rawdata = self.rawdata
      assert rawdata[i : i + 2] == "<!", (
          "unexpected call to " "parse_html_declaration()"
      )
      if rawdata[i : i + 4] == "<!--":
          # this case is actually already handled in goahead()
          return self.parse_comment(i)
      elif rawdata[i : i + 3] == "<![":
          return self.parse_marked_section(i)
      elif rawdata[i : i + 9].lower() == "<!doctype":
          # find the closing >
          gtpos = rawdata.find(">", i + 9)
          if gtpos == -1:
              return -1
          self.handle_decl(rawdata[i + 2 : gtpos])
          return gtpos + 1
      else:
          return self.parse_bogus_comment(i)
  
imports: import re
  import _markupbase
  from html import unescape
label_desc: Use image node_id 9 for calling the HTMLParser obj's underlying member method code with example usage: obj.parse_html_declaration(i) and returns: self, self, unknown, self, unknown