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
コメント
[…] https://posipochi.com/2021/04/17/python-pandas-selenium/ […]