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

**質問１**  
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()
    
```
CC BY-SA 3.0
2018-02-13T08:08:45.670
41686
2018-02-15T04:03:21.363
22565
question
python html python3
pythonのHTMLParserの使い方
## 回答１

Python 標準の html.parser は HTMLParser クラスを継承して自作のパーサを作成して利用します。なぜこのようになっているかといえば
HTMLParser を設計した人がそのような使い方をするように作ったからそのような使い方をします。

## 回答2

Beautiful Soup のような使い方をしたいならば Beautiful Soup を使いましょう。

なお Beautiful Soup は使用するパーサを選択でき、その一つに html.parser があります。  
つまり、Beautiful Soup は html.parser を使って作られており、より使いやすくしたものであるともいえます。

標準の html.parser を直接使う方法と、 Beautiful Soap
を使う方法とそれぞれにメリットとデメリットがあります。自分のやりたいことを踏まえて適切なライブラリを選択しましょう。

## 回答3

クラスの中に書いてあるのは関数ではなくメソッドです。メソッドの定義は上から順に実行されます。しかし、上から順にメソッドが呼び出されるわけではありません。

handle_starttag() メソッドが呼び出されるのは handle_starttag() を呼び出しときとなります。

上記コードでは handle_starttag() を明示的に呼び出しているコードはありませんが、
parser.feed(response.read().decode("utf-8")) で feed() というメソッドを呼び出しており、この
feed() メソッドやそこから呼び出されている別のメソッドの中でHTMLを処理しながら開始タグが見つかった際に handle_starttag()
を呼び出します。

クラスの定義や利用方法がわからないということであれば一度 Python の入門書などを読んだ方がよいと思います。

## 回答4

feed() メソッドの内部から呼び出される別のメソッドから handle_starttag() を呼び出す際に渡されます。

以下からソースコードが見れますので確認してください。

  * <https://github.com/python/cpython/blob/3.6/Lib/html/parser.py>

## 回答5

回答4と同様、feed() メソッドの内部から呼び出される別のメソッドから handle_data() を呼び出す際に渡されます。
CC BY-SA 3.0
2018-02-15T04:03:21.363
41724
2018-02-15T04:03:21.363
27410
41686
answer