渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

BeautifulSoupを使ったHTMLパース


前回記事からの続きです。

最低限の機械学習の知識を手に入れるため勉強中。


Pythonによるスクレイピング&機械学習

PythonのパーサーライブラリBeautifulSoupを使ってみます。
Beautiful Soup: We called him Tortoise because he taught us.

Python3版をインストール

pip3 install beautifulsoup4

HTMLの要素を取得する

Python内に擬似的なhtmlコードを記述して以下の動作をテストします。

  • 指定要素の取得
  • 複数要素の取得
  • 属性値の取得

BeautifulSoupの初期化

soup = BeautifulSoup(html, 'html.parser')

第1引数にパースするhtmlを、第2引数にパーサーの指定をします。ここではHTMLをパースするため、html.parserと代入します。 今後のこのsoup変数を使ってパース結果を取得していきます。

DOM構造をルートから辿っていくやり方

# h1要素の取得
soup.html.body.h1

このようにhtmlからドットシンタックスでDOM要素をつなげて指定要素を取得することが出来ます。

id要素の取得

# id:piyoの取得
soup.find(id="piyo")

find関数を使うと、最初の1つ目が取得できます。

# id:piyoの取得
soup.select("#piyo")

select関数を使っても同様のことが出来ますが、find関数と違い配列が戻り値です。

class要素の取得

# class:hogeの取得
soup.find(class_="hoge")
soup.select(".hoge")

先ほどのid要素取得と同様、find関数またはselect関数を使用して取得します。
※find関数の引数はclassではなくclass_です

指定要素全てを取得する

# 全a要素の取得
soup.find_all("a")

属性値取得

link = soup.find("a")
href = link.attrs['href']

このように要素に対してattrsプロパティでアクセスし、属性名を文字列で配列アクセスすることで取得できます。

DOM構造を指定して取得

# DOM構造で取得する
listGroup = soup.select("ul#test > li")

このようにselect関数と>を使ってDOM構造を指定した形で要素の取得が出来ます。

最後に今回のサンプルコードです。

以下のように出力されます。

h1: 渋谷ほととぎす通信
p1: ブログ更新が
p2: とてもとても
idPiyo 滞っています
piyo 滞っています
classHoge でも頑張ります
classHoge でも頑張ります
URL http://www.shibuya24.info/
URL http://www.shibuya24.info/archive/category/Unity
URL http://www.shibuya24.info/archive/category/DOTween
Unity
DOTween

最後に

今までローカルファイルに直書きしたHTMLでテストしましたが、URLを指定してサーバーから取得します。

本ブログのURLを指定すると、このように出力されます。

渋谷ほととぎす通信

参考サイト

環境

  • macOS 10.12.6
  • Python3.6.3
  • BeautifulSoup4 4.6.0