PythonのBeautifulSoupを使えば、HTML内の特定のdiv
タグやclass
属性、そしてp
要素から必要なデータを簡単に抽出できます。本記事では、これらの要素を活用したスクレイピングの基本から応用までを解説します。
BeautifulSoupの基本
div
やclass
属性、p
タグはHTML内でよく使われる要素です。BeautifulSoupを使えば、これらを効率よく検索し、必要なデータを取得できます。
インストールはpip
必要なライブラリも一緒にインストールしちゃいます。
pip install beautifulsoup4 requests lxml
サンプルHTMLの例
以下のサンプルHTMLを使って説明します。
<html>
<body>
<div class="product">
<h2>商品名1</h2>
<p class="description">これは商品1の説明です。</p>
<p class="price">1000円</p>
</div>
<div class="product">
<h2>商品名2</h2>
<p class="description">これは商品2の説明です。</p>
<p class="price">2000円</p>
</div>
<div class="product">
<h2>商品名3</h2>
<p class="description">これは商品3の説明です。</p>
<p class="price">3000円</p>
</div>
</body>
</html>
divタグやclass属性からデータを取得
基本操作
まずは、div
タグやclass
属性を指定してデータを取得します。
from bs4 import BeautifulSoup
html = """
<html>
<body>
<div class="product">
<h2>商品名1</h2>
<p class="description">これは商品1の説明です。</p>
<p class="price">1000円</p>
</div>
<div class="product">
<h2>商品名2</h2>
<p class="description">これは商品2の説明です。</p>
<p class="price">2000円</p>
</div>
<div class="product">
<h2>商品名3</h2>
<p class="description">これは商品3の説明です。</p>
<p class="price">3000円</p>
</div>
</body>
</html>
"""
soup = BeautifulSoup(html, 'html.parser')
# class属性で検索
products = soup.find_all("div", class_="product")
for product in products:
print(product)
p要素からデータを抽出
p
タグのテキストデータを取得する方法を紹介します。
すべてのpタグを取得
以下のコードで、すべてのp
タグを検索し、テキストを取得します。
# すべての<p>タグを取得
all_paragraphs = soup.find_all("p")
for p in all_paragraphs:
print(p.text)
特定のpタグを取得
class
属性を指定して、特定のp
タグ(例: 商品の説明や価格)を取得します。
# 商品説明と価格を取得
for product in products:
description = product.find("p", class_="description").text
price = product.find("p", class_="price").text
print(f"説明: {description}, 価格: {price}")
実際のウェブページからデータを収集
requests
を使って、ウェブページからデータを取得する例です。
サンプルコード
import requests
from bs4 import BeautifulSoup
url = "https://example.com/products"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 商品名、説明、価格を取得
products = soup.find_all("div", class_="product")
for product in products:
name = product.find("h2").text
description = product.find("p", class_="description").text
price = product.find("p", class_="price").text
print(f"商品名: {name}, 説明: {description}, 価格: {price}")
応用テクニック
正規表現を使った検索
class
属性やタグ名が部分一致する場合、正規表現を使います。
import re
# class属性に「description」を含む<p>タグを検索
descriptions = soup.find_all("p", class_=re.compile("description"))
for desc in descriptions:
print(desc.text)
注意点
- サイトの利用規約を確認
スクレイピングを行う前に、対象サイトの利用規約を必ず確認してください。 - サーバーへの配慮
リクエスト間隔を空けるなど、サーバー負荷を軽減する工夫を忘れずに。
まとめ
BeautifulSoupを使えば、div
やclass
、p
要素から簡単にデータを抽出できます。特定の属性やタグを組み合わせて検索することで、効率的に必要な情報を取得できるようになります。ぜひこの記事を参考に、実際のウェブスクレイピングプロジェクトに役立ててください!
コメント