Pythonでスクレイピングしてみる

こんばんは。きわさです。

今回は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>]

スポンサーリンク