Pythonを勉強しているのですが、HTMLParserの使い方がよくわからないのでここで質問させて頂きます。

質問1
python3でサイトのタイトルを取得するプログラムを書いたのですが、どうしてHTMLParserはこのようにクラスに入れて使うのでしょうか?

質問2
beatifulsoup4などではこのような使い方をしなくてとても使いやすかったのですが、HTMLParserもbeatifulsoup4のような使い方はできるのでしょうか?

質問3
クラスについても完璧にはわかってないので、お伺いしたいです。
クラスを実行すると中に書いてある関数は全部上から順番に実行されるようになっているのでしょうか?

質問4
def handle_starttag(self, tag, attrs):のattrsの値はタプルで返ってくると書いてあったのですがそもそもこの引数はどこからくるのでしょうか?

質問5
同じようにその下に書いてある関数のdataもどこからきているのでしょうか?
エンジニア方、アドバイスを頂けると幸いです。よろしくお願いします。

# -*- coding: utf-8 -*- 

import urllib.request
from html.parser import HTMLParser

class TestParser(HTMLParser): # HTMLParserを継承したクラスを定義する

    def __init__(self):
        HTMLParser.__init__(self)
        self.flag = False # タイトルタグの場合のフラグ

    def handle_starttag(self, tag, attrs): # 開始タグを扱うためのメソッド
        if tag == "title":
            self.flag = True

    def handle_data(self, data): # 要素内用を扱うためのメソッド
        if self.flag:
            print(data)
            self.flag = False

if __name__ == "__main__":

    url = "http://www.python.org/"
    print(urllib.request.urlopen(url))
    response = urllib.request.urlopen(url)


    parser = TestParser()        # パーサオブジェクトの生成
    parser.feed(response.read().decode("utf-8")) # パーサにHTMLを入力する

    parser.close()
    response.close()