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