こんばんは。きわさです。
今回は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>]
