LoginSignup
16
19

More than 5 years have passed since last update.

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

Posted at

やること

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タグのリンクを記事のリストに追加する
  2. Parserクラス内のタグ内データを検出するhandle_dataメソッドで記事のタイトルを検出し記事のリストに追加する
  3. main関数で記事リストのデータの出力

参考文献

16
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
19