Python BeautifulSoup でスクレイピングする

Python で html をスクレイピングするためのライブラリは lxml や PyQuery、Scrapy 、BeautifulSoup などいくつかありますが、私は BeautifulSoup を使っています。

バージョンが 3 系と 4 系がありますのでインストール時に注意が必要です。 beautifulsoup4 が 4 系で、 BeautifulSoup が 3 系となります。それさえ間違わないようにすればあとは pip でサクッとインストールするだけですので簡単ですね。

ドキュメントの日本語訳を公開してくださっている方がありますのでこちらを読めばだいたい大丈夫そうです。

今回ちょっとしたスクリプトを書いていて使った部分を書いてみます。

たとえば以下の様な html があるとします(iTunes Store の html を一部改変してます)。

<div id="left-stack">
  <div class="lockup product application">
    <a href="https://itunes.apple.com/jp/app/pazuru-doragonzu/"></a>

    <div class="artwork">
      <div class="fat-binary-blurb">
        <span>この App は iPhone、iPad の両方に対応しています。</span>
      </div>

      <ul class="list">
        <li>
          <div class="price">
            無料
          </div>
        </li>

        <li class="genre"><span class="label">カテゴリ:</span> <a href=
        "https://itunes.apple.com/jp/genre/ios-gemu/id6014?mt=8">ゲーム</a></li>

        <li class="release-date"><span class="label">更新:</span> 2014年3月18日</li>

        <li><span class="label">バージョン:</span> 6.4.3</li>

        <li><span class="label">サイズ :</span> 33.2 MB</li>

        <li class="language"><span class="label">言語:</span> 日本語、英語</li>

        <li><span class="label">販売元:</span> GungHo Online Entertainment,
        INC.</li>

        <li class="copyright">© (C)2012 GungHo</li>
      </ul>
    </div>
  </div>
</div>

ここからバージョンナンバーを抜き出しかったのでいろいろ試した結果、このように書きました。

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

a = soup.find_all("li", class_="release-date")
b = a[0].find_next_sibling("li")
b.span.decompose()
itunes_ver = b.text.strip()
return itunes_ver

バージョンのところは

<li><span class="label">バージョン:</span> 6.4.3</li>

spanclass="label" がついているだけで、特定に役立ちそうな属性がありません。なのですぐ上にある、

<li class="release-date"><span class="label">更新:</span> 2014年3月18日</li>

こちらの <li class="release-date"> を手がかりにします。

a = soup.find_all("li", class_="release-date") こうして得られる a は ResultSet というリストになっているのでその中身を取り出すために a[0] と指定します。そうしたあとで .find_next_sibling("li") とやれば次の <li> タグを取得できるという寸法です。

日本語ドキュメントを見ながら指定の仕方をあれこれ考えるのはパズルのような面白さがあります。