Pythonを使ったWebスクレイピングは、現代のデータ収集において非常に重要な役割を担っています。
特にウェブサイトのナビゲーションメニューや商品一覧などは、HTMLの<ul>タグや<li>タグを用いたリスト形式で構成されることが一般的です。
この記事では、BeautifulSoupライブラリを使用して、これらのリスト要素から目的のデータを効率的に抽出する手順を具体的に紹介します。
初心者の方でもコードをコピーしてすぐに試せるよう、基本から応用までステップを追って解説を進めていきます。
スクレイピングを始める前の準備
Pythonでスクレイピングを行うためには、まず必要なライブラリをインストールする必要があります。
2026年現在でも、HTML解析にはBeautifulSoup4が、ウェブページの取得にはRequestsやHTTPXが広く利用されています。
以下のコマンドを使用して、環境に必要なパッケージを導入しましょう。
pip install beautifulsoup4 requests
ライブラリのインストールが完了したら、Pythonスクリプト内でこれらをインポートすることで準備は完了です。
ulとliのリスト要素を取得する基本手順
リスト要素を取得する最も基本的な方法は、まずfindメソッドで親要素となる<ul>を特定し、その中にある<li>をfind_allメソッドで全て取得する方法です。
この手法は構造が単純なサイトにおいて、最も確実かつ直感的にデータを抽出できるアプローチとなります。
find_allメソッドによるリスト取得のコード例
具体的なコード例を見ていきましょう。
以下のプログラムは、HTML文字列から箇条書きの内容を抽出し、テキストのみを表示させる例です。
from bs4 import BeautifulSoup
# サンプルのHTMLデータ
html_doc = """
<ul>
<li>Python</li>
<li>JavaScript</li>
<li>Ruby</li>
</ul>
"""
# BeautifulSoupオブジェクトの作成
soup = BeautifulSoup(html_doc, 'html.parser')
# ul要素を取得
ul_element = soup.find('ul')
# ulの中にある全てのli要素を取得
li_elements = ul_element.find_all('li')
# テキストのみを取り出して表示
for li in li_elements:
print(li.text)
Python
JavaScript
Ruby
このように、親から子へと階層を絞り込んでいくことで、目的のリスト要素だけを正確に取得することが可能になります。
クラス名やIDを指定して特定のリストを抽出する
実際のウェブサイトには、ページ内に複数の<ul>タグが存在することが珍しくありません。
特定のリストだけを取得したい場合は、HTMLタグに設定されているclass属性やid属性を利用して範囲を限定します。
html_doc = """
<ul class="navigation">
<li>ホーム</li>
<li>サービス概要</li>
</ul>
<ul class="news-list">
<li>2026/01/01 ニュース1</li>
<li>2026/01/02 ニュース2</li>
</ul>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# クラス名を指定してニュースリストだけを取得
news_list = soup.find('ul', class_='news-list')
items = news_list.find_all('li')
for item in items:
print(item.get_text())
2026/01/01 ニュース1
2026/01/02 ニュース2
findメソッドの引数にclass_='クラス名'を渡すことで、特定の目的を持ったリストのみを狙い撃ちできます。
CSSセレクタを活用したスマートな抽出方法
BeautifulSoupには、CSSと同様の記法で要素を指定できるselectメソッドが用意されています。
複数の階層を一気に指定できるため、複雑な構造のHTMLからデータを抜く際に非常に強力です。
# selectメソッドを使った記述
# 「classがnews-listであるulの中にあるli」を直接指定
items = soup.select('ul.news-list > li')
for item in items:
print(item.string)
selectメソッドを使用すると、コードの行数を減らしつつ、可読性の高いスクリプトを記述できるメリットがあります。
リスト内にあるリンク(aタグ)の情報を取得する
多くの場合、リスト要素の中にはリンク(<a>タグ)が含まれています。
テキストだけでなく、リンク先のURLを取得したい場合は、li要素の中からさらにfindメソッドでaタグを探し、href属性を参照します。
html_doc = """
<ul class="links">
<li><a href="https://example.com/p1">ページ1</a></li>
<li><a href="https://example.com/p2">ページ2</a></li>
</ul>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# リスト内のアンカータグからURLとテキストを取得
for li in soup.select('ul.links li'):
a_tag = li.find('a')
if a_tag:
title = a_tag.text
url = a_tag.get('href')
print(f"タイトル: {title}, URL: {url}")
タイトル: ページ1, URL: https://example.com/p1
タイトル: ページ2, URL: https://example.com/p2
このように、属性値の取得にはgetメソッドを使用するのが一般的です。
データ抽出方法の比較
これまでに紹介した抽出方法の特徴を以下の表にまとめました。
| メソッド | 主な特徴 | おすすめの利用シーン |
|---|---|---|
find / find_all | シンプルで分かりやすく、処理が高速 | 構造が単純な場合や初心者の方 |
select | CSSセレクタが使え、柔軟な指定が可能 | 複雑な階層構造から抽出する場合 |
get_text() / text | タグ内の文字列を抽出する | テキストデータのみが必要な場合 |
get('href') | 属性値(URLなど)を取得する | リンク先の一覧を作成する場合 |
状況に応じてこれらのメソッドを使い分けることが、効率的なスクレイピングへの近道です。
まとめ
PythonのBeautifulSoupを利用すれば、ウェブページ上の<ul>や<li>といったリスト要素を自由自在に抽出できます。
基本となるfind_allメソッドによる階層的な指定から、CSSセレクタを用いたselectメソッドによる高度な指定まで、用途に合わせて最適な手法を選択しましょう。
また、属性値の取得やクラス名でのフィルタリングを組み合わせることで、ノイズの少ない正確なデータ収集が可能になります。
スクレイピングを行う際は、対象サイトの利用規約を遵守し、サーバーに負荷をかけない適切な間隔を空けて実行することを忘れないでください。
今回学んだステップを活かして、日々の業務やデータ分析の効率化に役立てていただければ幸いです。
