Pythonでサイトの表の列数カウント【BeautifulSoup4】
上の記事でopen shelfの作品数のカウントをpythonで行ったと書きましたがその方法について開設します。
この記事はPythonの基礎がある方向けですが、知識がなくともこの記事の指示に従えば作品数をカウントするコードを実行することはできます。
実行環境
pythonをする実行環境がない方は
Google Colab
を利用するのが手っ取り早いです。
今回スクレイピングにはBeautifulSoupというライブラリを用いるので、実行環境がある方は
$ pip install beautifulsoup4
のコマンドを実行して今回必要なライブラリを入れてください。
Google Colabを利用する場合はすでに入っています。
コード解説
import urllib.request
from bs4 import BeautifulSoup
url = "https://open-shelf.appspot.com/"
req = urllib.request.Request(url)
html = urllib.request.urlopen(req)
soup = BeautifulSoup(html, "html.parser")
lis=soup.find_all("td",class_="title")
print(len(lis))
早速ですが上のコードがOpen Shelfに掲載されている作品数を調べるためのコードです。
これを実行すればカウント結果が表示されます。
では今から順を追ってコードの説明していきます。
一行目でimportしたurllibはその名の通りURLを扱うライブラリです。このライブラリによってURLを開くことができます。
そして5,6行目でurlの指定先のhtml情報をオブジェクトとして取得します。
7行目では、このオブジェクトを私達がウェブページ上でF12を押したときに見られるhtmlコードの形式に直します。
8行目のsoup.find_allのメソッドでタイトルの欄にある項目を全て取得しています。
どうしてこのコードでそのような操作になるか説明します。
htmlのコードをF12で閲覧すると、この本の表はtableタグがついていて
<tr>~<tr>で区切られたコードが一列を表しています。
上の画像青枠を表すhtmlのコード
<tr>
<td class="title" value="あおいろぼん">
<a href="TheBlueBook/index.html" _target="_self">青色本</a>
</td>
<td class="author" value="ルートヴィヒ・ウィトゲンシュタイン">
<a href="./_authors/LudwigWittgenstein.html" target="_self">ルートヴィヒ・ウィトゲンシュタイン</a>
</td>
<td class="translator" value="ミック">ミック</td>
</tr>
soup.find_allメソッドの引数に”td”,class_=”title”をした場合
例えば、上のコードからは下の部分のみをオブジェクトとして取り出します。
<td class="title" value="あおいろぼん">
<a href="TheBlueBook/index.html" _target="_self">青色本</a>
</td>
このような操作をコード全体に行うわけです。
自分は先ほどこのメソッドでタイトルの欄にある項目を全て取得といいましたが、
正確に言うと「タグがtd、classがtitleのオブジェクト」全てを取得というのがより正しい言い方ですね。その中にタイトル情報が入っていたという形です。
また、今回は個数をカウントするだけなので行いませんでしたが
8行目に続けて
title_data=[ele["value"] for ele in lis ]
などと書いてやればタイトル名のリストを取り出すことができます。
後、自分は説明がめんどくさくなるのでやりませんでしたが、万全を期すためには
table=soup.find("table", class_="booklist bordered")
lis=table.find_all("td",class_="title")
と書いたほうがよいかもしれません。
といったところで8行目の解説は終わりにして
9行目でlisの要素数をprintします。
結果は「207」でした。
コードを書かないでカウントできる!?
記事をここまで書き上げたところであることに気が付きました。
数を数えるくらいだったら、開発者ツール(F12押して出る画面)でtitleって検索すればよくね?
それで一度実際にtitleで検索したところ、結果は214件
他にもtitleの文字列があってそれに引っかかってるみたいです。
また、この検索はコード全体を調べるわけではなく、class=”title”としても0件と表示されてしまいました。
そう考えると実際の数を調べるには214件全てチェックする必要が生まれてしまい、やっぱりコードを書かないでカウントするのは難しいという結論に至りました。