BeautifulSoupを使ったスクレイピング入門

スクレイピングとは

入手したひとまとまりのデータを解析し、不要な部分を削ったり、必要な部分だけを取り出したり、
一部を置き換えたり、並べ替えらたりし 目的に合うように整形すること。
WebページやWeb上で公開されているHTMLについてこのような処理を行うことをWebスクレイピングと言います。
Webスクレイピングにより、Webページとして人間が見やすい形で公開されているデータを、
目的の形に利用しやすいように変換して活用することができるようになります。

BeatifulSoup

Pythonでのスクレイピング用のライブラリ。

  • スクレイピングライブラリ
  • HTML,XMLをパース
  • Python2系、3系とも対応
  • 標準パッケージより効率が良い

スクレイピング方法

  • 対象のWebページを良く見る
  • 抽出する箇所のタグ、検索条件を決める
  • BeatifulSoupを使いプログラミングする

WikiPedia のWebページをスクレイピング

WikiペディアのPythonのページをスクレイピングしていみます。

https://ja.wikipedia.org/wiki/Python

Pythonの紹介のページから、3系のリリース日が一覧が記載されている
表のデータをスクレイピングするサンプルです。

from bs4 import BeautifulSoup
from urllib.request import urlopen

'''
Wikiペディアの 「Python」に関するページを
スクレイピングするサンプル

Python version3系のリリース日の表を抽出するサンプル

'''

html = urlopen('https://ja.wikipedia.org/wiki/Python')
#print (html.read())

##パーサには、html.parserを指定する
bsObj = BeautifulSoup(html.read(),'html.parser')

## HTMLのデータが表示される
#print (bsobj)

'''
HTMLの要素を検索する。
Tableタグ class属性が "perttytable" であるテーブルを検索する
Version2系、3系2つのテーブルがあるので、2つ目のテーブルを選択するので
インデックス番号を指定
'''
table = bsObj.findAll("table",{"class":"prettytable"})[1]

## tr を検索し行を抽出
rows = table.findAll("tr")
for row in rows:
    #行をループしながら、td, thタグを検索し、
    #各セルのデータをget_text()関数を使い抽出する
    for cell in row.findAll(['td', 'th']):
        print(cell.get_text() +  ',', end='' )
    print()

さらに応用

次は、目次の1章の節の情報を取得するプログラムは以下のようになります。

top = bsObj.findAll('div',{'id':'toc'})[0]
#print( top )
sectionOne = top.findAll('li',{'class' : 'toclevel-1'})[0]
#print(sectionOne)
sectionOne.a.get_text()

for rows in sectionOne.findAll('li'):
    str = ''
    for row in rows.findAll('span'):
        str += row.get_text()

    print (str)

XMLもパースできます。

BeatifulSoupはHTMLだけでなく、XMLモパースすることができます。

Livedoor 天気情報のRSSフィードをパースする例です。

http://weather.livedoor.com/weather_hacks/rss_feed_list

関東地方の天気概況を取得
http://weather.livedoor.com/forecast/rss/3.xml

from bs4 import BeautifulSoup
from urllib.request import urlopen


html = urlopen('http://weather.livedoor.com/forecast/rss/3.xml')
#print (html.read())

##パーサには、XMLのパーサ lxml を指定する。
bsObj = BeautifulSoup(html.read(),'lxml')

#print(bsObj)
description = bsObj.findAll('description')[0]
print(description.get_text())

BeatifulSoupの詳細

BeatifulSoupパッケージの詳しい利用方法を学びたい方は以下の書籍がおすすめです