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_starttag(self, i):
      self.__starttag_text = None
      endpos = self.check_for_whole_start_tag(i)
      if endpos < 0:
          return endpos
      rawdata = self.rawdata
      self.__starttag_text = rawdata[i:endpos]
  
      # Now parse the data between i+1 and j into a tag and attrs
      attrs = []
      match = tagfind_tolerant.match(rawdata, i + 1)
      assert match, "unexpected call to parse_starttag()"
      k = match.end()
      self.lasttag = tag = match.group(1).lower()
      while k < endpos:
          m = attrfind_tolerant.match(rawdata, k)
          if not m:
              break
          attrname, rest, attrvalue = m.group(1, 2, 3)
          if not rest:
              attrvalue = None
          elif (
              attrvalue[:1] == "'" == attrvalue[-1:]
              or attrvalue[:1] == '"' == attrvalue[-1:]
          ):
              attrvalue = attrvalue[1:-1]
          if attrvalue:
              attrvalue = unescape(attrvalue)
          attrs.append((attrname.lower(), attrvalue))
          k = m.end()
  
      end = rawdata[k:endpos].strip()
      if end not in (">", "/>"):
          self.handle_data(rawdata[i:endpos])
          return endpos
      if end.endswith("/>"):
          # XHTML-style empty tag: <span attr="value" />
          self.handle_startendtag(tag, attrs)
      else:
          self.handle_starttag(tag, attrs)
          if tag in self.CDATA_CONTENT_ELEMENTS:
              self.set_cdata_mode(tag)
      return endpos
  
imports: import re
  import _markupbase
  from html import unescape
label_desc: Use image node_id 12 for calling the HTMLParser obj's underlying member method code with example usage: obj.parse_starttag(i) and returns: endpos, endpos, endpos