[Python3] HTMLParserによるウェブスクレイピング実践入門

# やること
Googleニュースの記事リストのタイトルとそのリンクを抽出する．　　

# 環境
言語

+ Python3

ライブラリ

+ requests
+ HTMLParser

# ライブラリのインストール
HTMLParserは標準モジュールなので追加インストールはありません．

```setup.sh
pip install requests
```

# 実践

```get_news.py
# -*- coding: utf-8 -*-


import requests
from html.parser import HTMLParser


class Parser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.title = False
        self.link = False
        self.data = []

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == "h2" and "class" in attrs and attrs['class'] == "esc-lead-article-title":
            self.data.append({})
            self.title = True
            self.link = True

        if tag == "a" and self.link == True:
            self.data[-1].update({"link": attrs["href"]})

    def handle_data(self, data):
        if self.title == True or self.link == True:
            self.data[-1].update({"title": data})
            self.title = False
            self.link = False


def main():
    payload = {"topic" : "t"}
    r = requests.get('https://news.google.com/news/section', params=payload)
    parser = Parser()
    parser.feed(r.text)
    parser.close()

    for i in parser.data:
        print("Title: " + i["title"], "\nLink: " + i["link"] + "\n")


if __name__ == '__main__':
    main()

```

これを実行すると以下の結果が返ってくる． 　　
Googleのテクノロジートピックにアクセスし，20件のニュース記事を引っ張る．

```
$ python3 main.py
Title: いつの間にかiPhoneの画面が点いている? という現象を防ぐには 
Link: http://news.livedoor.com/article/detail/13218777/

Title: ランサムウェアに影響されない安全なOSとは？ 
Link: http://gigazine.net/news/20170617-microsoft-ransomware-against-windows-10-s/

Title: 「Appleは自動運転システムに注力している」ティム・クックCEO、開発を認める 
Link: http://www.gizmodo.jp/2017/06/tim-cook-accepts-developing-selfdriving-car.html

Title: イーロン・マスクが描く「火星移住」計画 100万人規模を視野に 
Link: https://forbesjapan.com/articles/detail/16633

Title: リチャード・ハモンドが350km/hオーバーで事故を起こしたEVスーパーカー｢リマック コンセプト_ワン｣とは、こんなクルマだ！ 
Link: http://jp.autoblog.com/2017/06/18/rimac-concept-one/

Title: 「E3」で発表されたゲーミングギアまとめ。最先端技術からレトロなものまで 
Link: http://top.tsite.jp/news/technology/o/35933635/?sc_int=tcore_news_recent

Title: Galaxy Note 8のパネルとされる画像がリークされる！S8と変化なし？ 
Link: http://iphone-mania.jp/news-172076/

Title: 【噂】iPhone 8のディスプレイサイズが判明か？ 
Link: http://www.appps.jp/266777/

Title: MacBook Proユーザーの私が、任天堂スイッチに救われた話 
Link: http://japanese.engadget.com/2017/06/16/macbook-pro/

Title: 「Pixel」シリーズ、出荷台数はようやく100万台を突破か 
Link: http://ggsoku.com/2017/06/app-install-number-on-play-store-implies-the-actual-shipment-number-of-pixel-series/

Title: 目指すは「一家に一台」 SIEJA盛田厚プレジデントにインタビュー 
Link: https://mainichi.jp/articles/20170617/dyo/00m/200/028000c

Title: Windows 10 IP ビルド16215で、Edgeブラウザーが大幅に強化された 
Link: http://ascii.jp/elem/000/001/501/1501468/

Title: GIF・30周年、いまもネットを動かし続けるその「誕生秘話」 
Link: http://news.livedoor.com/article/detail/13211939/

Title: Windowsの不要になった回復パーティションを削除する【作業編その2】 
Link: http://ascii.jp/elem/000/001/501/1501374/

Title: マイクロソフトXbox責任者、Xbox One XのVR対応への展望を語る 
Link: http://getnews.jp/archives/1789465

Title: 伸びる腕を持つ個性豊かな「ファイター」を操れ！ Nintendo Switch向けアクション「ARMS」 
Link: https://www.j-cast.com/trend/2017/06/18300351.html

Title: iPhone 8、やはり「ディスプレイ一体型指紋認証センサー」を実装か 
Link: http://ggsoku.com/2017/06/new-leaked-slide-implies-touch-id-of-iphone-8-would-be-integrated-under-the-display/

Title: iOS 11で音声通話アプリの音質がよくなるってホント? - いまさら聞けないiPhoneのなぜ 
Link: http://top.tsite.jp/news/news/o/35933598/?sc_int=tcore_news_recent

Title: OnePlus、「OnePlus 5」の撮影サンプルを公開 
Link: http://ggsoku.com/2017/06/oneplus-ceo-officially-reveals-camera-samples-of-oneplus-5/

Title: メモを残すだけじゃない iPhone「メモ」アプリの使い方 
Link: http://www.itmedia.co.jp/mobile/articles/1706/18/news014.html

```

# 解説

1. Parserクラス内の開始HTMLタグを検出するhandle_starttagメソッドで記事のリンクとタイトルの要素があるh2タグを検出しその中のaタグのリンクを記事のリストに追加する
1. Parserクラス内のタグ内データを検出するhandle_dataメソッドで記事のタイトルを検出し記事のリストに追加する
1. main関数で記事リストのデータの出力

# 参考文献

+ [20.2. html.parser— HTML および XHTML のシンプルなパーサー &#8212; Python 3.6.1 ドキュメント](https://docs.python.jp/3.6/library/html.parser.html)