こんばんは。きわさです。
今回はpythonでスクレイピングをしてみます。
BeautifulSoupを使ってみたいと思います。
入っていなければインストールします。
pip install bs4
import bs4 import requests url = "http://XXXXXX" res = requests.get(url) soup = bs4.BeautifulSoup(res.text, "html.parser")
パース自体はこれだけです。
あとはほしい要素を探していきます。
今回は例として以下のHTMLを取得したことにします。
<html> <head><head> <body> <h3>見出し1</h3> <table id="table1"> <tbody> <tr> <th>列1</th> <th>列2</th> </tr> <tr> <td>データ1</td> <td class="data">データ2</td> </tr> </tbody> </table> <h3>見出し2</h3> <table> <tbody> <tr> <th>行1</th> <td class="data">データ1</td> </tr> <tr> <th>行2</th> <td class="data">データ2</td> </tr> </tbody> </table> </body> </html>
タグで取得
まずはh3タグを1つ取得してみます。
>>> soup.find("h3") <h3>見出し1</h3> >>> soup.find("h3").text '見出し1'
findを使うと対象の要素を1つ取得できます。
.textでその要素のテキストを取得できます。
複数取得したい場合は find_all を使います。
>>> soup.find_all("h3") [<h3>見出し1</h3>, <h3>見出し2</h3>]
クラスで取得
クラスで取得したい場合は class_ = {クラス名} のように指定します。
>>> soup.find_all(class_="data") [<td class="data">データ2</td>, <td class="data">データ1</td>, <td class="data">データ2</td>]
クラスが data である要素が取れました。
idで取得
idでも同様に取得できます。id = {id} のように指定します。
>>> soup.find(id="table1") <table id="table1"> <tbody> <tr> <th>列1</th> <th>列2</th> </tr> <tr> <td>データ1</td> <td class="data">データ2</td> </tr> </tbody> </table>
idが table1 の要素が取れました。
CSSセレクタで取得する
CSSセレクタでも取得ができます。
以下のように td.data と指定すれば、classがdataであるtd要素がすべて取得できます。
>>> soup.select("td.data") [<td class="data">データ2</td>, <td class="data">データ1</td>, <td class="data">データ2</td>]
以下のように table1 のみに絞り込むこともできます。
>>> soup.select("#table1 td.data") [<td class="data">データ2</td>]