【Python】スクレイピングで特定のtableタグだけを解析する方法

seleniumによるHTML解析を10倍速くした方法 Pythonの使い方

Pythonによるスクレイピングでテーブルデータを拾う場合、Pandasだけで済みます。Pandasにより、table要素内をDataFrameとして得られます。html内にtable要素が複数あると、table毎にDataFrameが生成さるため、DataFrameも複数になります。できればtable要素を指定して一つのDataFrameにしたいものです。

Pandasでテーブルデータを拾う

下のようなhtmlがhttp://localhost/index.htmlにあり、tableからDataFrameを生成します。

<html>
<head>
<meta charset="UTF-8" />
</head>
<body>

<table class="familly-name-type">
<tr><th>ID</th><th>姓</th><th>身長</th><th>体重</th></tr>
<tr><td>1</td><td>佐藤</td><td>150</td><td>50</td></tr>
<tr><td>2</td><td>山下</td><td>155</td><td>52</td></tr>
<tr><td>3</td><td>田中</td><td>175</td><td>68</td></tr>
</table>

<table class="full-name-type">
<tr><th>ID</th><th>姓</th><th>名</th><th>身長</th><th>体重</th></tr>
<tr><td>4</td><td>岩田</td><td>隆</td><td>168</td><td>60</td></tr>
<tr><td>5</td><td>須藤</td><td>知義</td><td>165</td><td>60</td></tr>
<tr><td>6</td><td>飯島</td><td>ヤスシ</td><td>182</td><td>98</td></tr>
</table>

</body>
</html>

まずはPandasのみを使った、シンプルな方法からです。

import pandas as pd

dfs = pd.read_html("http://localhost/index.html")
print(dfs)

len(dfs)は2です。しかし、2番目の表だけに絞って抽出したいときはどうするのでしょう。dfs[1]で構わないのですが、ページのレイアウトは常に変化する可能性があります。いけません。

そこで、read_html()でマッチングを使います。2番目の表にしか存在しないデータでマッチングを取れば、いけそうです。岩田さんは2番目の表にしかいません。これを利用します。

dfs = pd.read_html(url, match='岩田')
print(dfs)

冗談です。こんなその場しのぎのアルゴリズムでは、許されるわけがありません。

Selniumで要素を特定し、Pandasで解析する方法

目的のデータがあるtableを特定する方法があった場合、seleniumが使えます。上のhmtlでは、2番目のtableにクラスfull-name-typeが設定されています。ワザとらしいですが。これを利用します。

import pandas as pd
from selenium import webdriver

web_driver = webdriver.Chrome()
web_driver.get("http://localhost/index.html")

elem_table = web_driver.find_element_by_css_selector("table.full-name-type")
html = elem_table.get_attribute('outerHTML')
dfs = pd.read_html(html)
print(dfs)

web_driver.find_element_by_css_selector()で必要なtable要素を取得し、要素から生成したhtmlをPandasによって解析するのです。WebElement.get_attribute(‘outerHTML’)で、table要素を含むhtmlが取得できます。こっちの方が、HTMLのデザイン変更に耐えられ、かつエレガントです。

PandasとBeautifulSoup4のインストール

Pandasの他、BeautifulSoup4とそれがテーブルの解析に使う、lxmlとhtml5libもインストールします。

pip install pandas
pip install lxml
pip install html5lib
pip install bs4

コメント

タイトルとURLをコピーしました