BeautifulSoupはPythonのライブラリで、HTMLやXMLなどのマークアップ言語からデータを抽出するのに便利です。この記事では、BeautifulSoupを使ってHTMLから値を取得する方法を説明します。
BeautifulSoupの基本的な説明と特徴
BeautifulSoupは、HTMLやXMLなどのマークアップ言語を解析して、タグや属性、テキストなどの要素を取得するためのライブラリです。Pythonの標準ライブラリではないため、pipコマンドでインストールする必要があります。
BeautifulSoupの特徴としては、以下のようなものがあります。
- 柔軟な解析方法が可能
- Pythonの標準ライブラリとの組み合わせが容易
- HTMLの構造に関係なく解析可能
- スクレイピングに利用できる
BeautifulSoupを使ってHTMLの値を取得する準備
BeautifulSoupを使ってHTMLから値を取得するためには、まずHTMLを解析する必要があります。HTMLの解析には、以下のようにBeautifulSoupオブジェクトを生成します。
from bs4 import BeautifulSoup
html = """<html>
<head>
<title>サイトのタイトル</title>
</head>
<body>
<div class="content">
<p>ここに値があります</p>
</div>
</body>
</html>"""
soup = BeautifulSoup(html, 'html.parser')
上記の例では、HTMLを文字列として定義して、BeautifulSoupオブジェクトを生成しています。HTMLをファイルから読み込む場合は、open関数を使ってファイルを開いて、BeautifulSoupオブジェクトを生成します。
タグを指定して値を取得する方法
HTMLから値を取得する方法の一つは、タグを指定して値を取得する方法です。例えば、以下のHTMLがあった場合、pタグの中にある値を取得することができます。
<html>
<body>
<p>ここに値があります</p>
</body>
</html>
上記のHTMLからpタグの値を取得する場合は、以下のようになります。
from bs4 import BeautifulSoup
html = """<html>
<body>
# <p>ここに値があります</p>
</body>
</html>"""
soup = BeautifulSoup(html, 'html.parser')
p_value = soup.find('p').text
print(p_value)
# 出力結果:ここに値があります
上記の例では、findメソッドを使ってpタグを指定し、text属性を使ってその中の値を取得しています。
属性を指定して値を取得する方法
HTMLから値を取得する方法のもう一つは、属性を指定して値を取得する方法です。例えば、以下のHTMLがあった場合、class属性がcontentのdivタグの中にあるpタグの値を取得することができます。
<html>
<body>
<div class="content">
<p>ここに値があります</p>
</div>
</body>
</html>
上記のHTMLからclass属性がcontentのdivタグの中にあるpタグの値を取得する場合は、以下のようになります。
from bs4 import BeautifulSoup
html = """<html>
<body>
<div class="content">
<p>ここに値があります</p>
</div>
</body>
</html>"""
soup = BeautifulSoup(html, 'html.parser')
p_value = soup.find('div', {'class': 'content'}).find('p').text
print(p_value)
# 出力結果:ここに値があります
上記の例では、findメソッドを使ってdivタグを指定し、その中からclass属性がcontentのものを指定しています。その中からまたpタグを指定して、その中の値を取得しています。
複数の値を一度に取得する方法
BeautifulSoupを使ってHTMLから複数の値を一度に取得することもできます。例えば、以下のHTMLがあった場合、pタグの中にある値を全て取得することができます。
<html>
<body>
<p>ここに値があります</p>
<p>ここにも値があります</p>
</body>
</html>
上記のHTMLからpタグの全ての値を取得する場合は、以下のようになります。
from bs4 import BeautifulSoup
html = """<html>
<body>
<p>ここに値があります</p>
<p>ここにも値があります</p>
</body>
</html>
'HTML'
soup = BeautifulSoup(html, 'html.parser')
p_values = [p.text for p in soup.find_all('p')]
print(p_values)
# 出力結果:['ここに値があります', 'ここにも値があります']
上記の例では、find_allメソッドを使って全てのpタグを取得し、リスト内包表記を使ってpタグの値を取得しています。
BeautifulSoupによる値取得の応用例
BeautifulSoupを使ってHTMLから値を取得することで、Webスクレイピングやデータ収集などの用途に利用することができます。以下に、実際にBeautifulSoupを使ってWebスクレイピングをする例を紹介します。
例えば、以下のようなサイトがあった場合、最新のニュース記事のタイトルとリンクを取得することができます。
<html>
<body>
<div class="news">
<h2><a href="https://example.com/news/1">最新のニュース記事1</a></h2>
<p>ここに記事の概要があります。</p>
<h2><a href="https://example.com/news/2">最新のニュース記事2</a></h2>
<p>ここに記事の概要があります。</p>
<h2><a href="https://example.com/news/3">最新のニュース記事3</a></h2>
<p>ここに記事の概要があります。</p>
<h2><a href="https://example.com/news/4">最新のニュース記事4</a></h2>
<p>ここに記事の概要があります。</p>
</div>
</body>
</html>
上記のHTMLから最新のニュース記事のタイトルとリンクを取得する場合は、以下のようになります。
from bs4 import BeautifulSoup
import requests
url = 'https://example.com/news'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
news_list = []
for h2 in soup.find_all('h2'):
title = h2.text
link = h2.a['href']
news_list.append({'title': title, 'link': link})
print(news_list)
# 出力結果:[{'title': '最新のニュース記事1', 'link': 'https://example.com/news/1'}, {'title': '最新のニュース記事2', 'link': 'https://example.com/news/2'}, {'title': '最新のニュース記事3', 'link': 'https://example.com/news/3'}, {'title': '最新のニュース記事4', 'link': 'https://example.com/news/4'}]
上記の例では、requestsモジュールを使ってWebページの内容を取得し、BeautifulSoupオブジェクトを生成しています。その中からh2タグを取得し、リンクのURLとタイトルを取得してリストに追加しています。
まとめ
BeautifulSoupは、HTMLやXMLなどのマークアップ言語からデータを抽出するためのライブラリです。タグや属性、テキストなどの要素を取得することができます。これを使ってWebスクレイピングやデータ収集などの用途に利用することができます。


![[Python]Pandasで列を結合する方法](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/10/1-440.jpg)

![[Python]Pandasを使ったCSVファイルへの配列出力方法](https://machine-learning-skill-up.com/knowledge/wp-content/uploads/2023/11/1-306.jpg)
