docs: def pumper(html_generator):
      """
      Pulls HTML from source generator,
      feeds it to the parser and yields
      DOM elements.
      """
      source = html_generator()
      parser = etree.HTMLPullParser(
          events=('start', 'end'),
          remove_comments=True
      )
      while True:
          for element in parser.read_events():
              yield element
          try:
              parser.feed(next(source))
          except StopIteration:
              # forces close of any unclosed tags
              parser.feed('</html>')
              for element in parser.read_events():
                  yield element
              break