Beautiful Soupを使ったウェブスクレイピングの基本

Beautiful Soupの概要

Beautiful SoupはPythonのライブラリで、HTMLやXMLドキュメントを解析し、データを抽出するために使用されます。複雑なHTML構造を簡単に操作できる強力なツールです。

基本的な使用方法

# 必要なライブラリのインポート
from bs4 import BeautifulSoup

# サンプルHTMLドキュメント
html_content = """
<html>
<head><title>テストページ</title></head>
<body>
<p class="heading"><b>ウェブスクレイピング入門</b></p>
<p class="content">ここにはテキストが含まれています</p>
<a href="https://example.com" class="link" id="link1">リンク1</a>
<a href="https://example.com/2" class="link" id="link2">リンク2</a>
</body>
</html>
"""

# HTMLをBeautiful Soupオブジェクトに変換
soup = BeautifulSoup(html_content, 'lxml')

# フォーマットされたHTMLを出力
formatted_html = soup.prettify()
print(formatted_html)

コンテンツの読み取り

# 特定のタグを取得
header = soup.head
paragraph = soup.p
link = soup.a

# コンテンツの読み取り
link_text = soup.a.string
link_href = soup.a['href']

print(header)
print(paragraph)
print(link)
print(link_text)
print(link_href)

Beautiful Soupの4つの主要オブジェクト

Beautiful Soupは複雑なHTMLドキュメントをツリー構造に変換し、各ノードをPythonオブジェクトとして扱います。主なオブジェクトは4種類あります:

  • Tag:HTMLタグを表すオブジェクト
  • NavigableString:タグ内のテキストを表すオブジェクト
  • BeautifulSoup:ドキュメント全体を表すオブジェクト
  • Comment:HTMLコメントを表すオブジェクト
# オブジェクトタイプの確認
print(type(soup))  # BeautifulSoupオブジェクト
print(type(soup.head))  # Tagオブジェクト
print(type(soup.a.string))  # NavigableStringオブジェクト

find()メソッドの使用

find()メソッドは、指定された条件に一致する最初のタグオブジェクトを返します。

# find()メソッドの使用例
first_paragraph = soup.find('p')
title_paragraph = soup.find(attrs={"class": "heading"})
text_search = soup.find(text="リンク1")

print(first_paragraph)
print(title_paragraph)
print(text_search)

find_all()メソッドの使用

find_all()メソッドは、指定された条件に一致するすべてのタグオブジェクトをリストとして返します。

# find_all()メソッドの使用例
all_links = soup.find_all('a')
first_link = soup.find_all('a', limit=1)[0]
sister_links = soup.find_all(attrs={"class": "link"})

print(all_links)
print(first_link)
print(sister_links)

CSSセレクターの使用

Beautiful SoupはCSSセレクターを使用して要素を選択することもできます。

# select_one() - 最初の一致要素を返す
first_sister = soup.select_one('.link')

# select() - すべての一致要素をリストで返す
all_sisters = soup.select('.link')
title_by_id = soup.select('#link1')
nested_selection = soup.select('head title')

print(first_sister)
print(all_sisters)
print(title_by_id)
print(nested_selection)

テキストと属性の取得

# テキストの取得
bold_text = soup.select('b')[0].get_text()

# 属性の取得
link_href = soup.select('#link1')[0].get('href')

print(bold_text)
print(link_href)

XMLデータの扱い

Beautiful SoupはXML形式のデータも解析できます。XMLは構造化されたデータ交換形式として、フロントエンド、モバイルアプリ、バックエンド間のデータ通信に使用されます。

# XMLデータの例
xml_data = """
<data>
    <item key="name">値</item>
</data>
"""

# XMLの解析
xml_soup = BeautifulSoup(xml_data, 'xml')
item_value = xml_soup.find('item')['key']
print(item_value)

タグ: beautifulsoup4 Python web-scraping lxml css-selectors

7月23日 17:59 投稿