BeautifulSoupでHTMLから値を取得する方法

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スクレイピングやデータ収集などの用途に利用することができます。