1. HTMLツリーをナビゲートする
今日はHTMLツリーの神秘的な世界に飛び込んで、本物のプログラミング忍者みたいにウェブページから情報を抽出するスキルを身につけるよ。マジックツールの
BeautifulSoup
を使い続けて、必要なデータを見つけ出し、すでにクールなスクリプトにさらに機能性を追加するぜ!では、キーボードを準備して、スタート!
まずデータを抽出する前に、HTMLツリーが何なのかをもう一度考えよう。それを巨大な「家系図」みたいにイメージしてみて。各タグが家族の一人ひとりみたいなもの。親、子、兄弟姉妹がいる。 私たちのタスクはこの「家族」の中から特定の人を見つけて、大切な家宝(データ)を丁寧に取り出すことだ。
こんなふうにHTMLが書かれてるかも:
<div class="article">
<h2 id="title">タイトル</h2>
<p class="content">これは記事のテキスト...</p>
<a href="https://example.com" class="link">続きを読む</a>
</div>
ここではdiv
が親要素で、h2
, p
, a
がその子要素だよ。それぞれ属性と内容を持ってる。
2. タグを使ったデータ抽出
BeautifulSoup
はツリーをナビゲートしてデータを抽出する便利なメソッドを提供してるよ。基本的なfind()
メソッドから始めよう。
これは特定のタグを持つ最初の要素を見つけることができる。一方find_all()
は、まるで検索ブルドーザーみたいに
すべての要素を掘り起こしてくれる。
from bs4 import BeautifulSoup
html_doc = """<div class="article">
<h2 id="title">タイトル</h2>
<p class="content">これは記事のテキスト...</p>
<a href="https://example.com" class="link">続きを読む</a>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
# 最初の段落を見つける
first_paragraph = soup.find('p')
print(first_paragraph.text) # 出力: これは記事のテキスト...
# 全てのリンクを見つける
all_links = soup.find_all('a')
for link in all_links:
print(link['href']) # 出力: https://example.com
3. 属性で要素をフィルタリングする
タグ検索をマスターしたから、次はid
やclass
のような属性を使って要素をフィルタリングする方法を学ぼう。
これらの属性は、ページのしおりの役割を果たしていて、どれが重要か一目でわかるよ。
<div class="article">
<h2 id="title">タイトル</h2>
<p class="content">これは記事のテキスト...</p>
<a href="https://example.com" class="link">続きを読む</a>
</div>
# 特定のidを持つ要素を見つける
title = soup.find(id="title")
print(title.text) # 出力: タイトル
# "content"クラスを持つすべての要素を見つける
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
print(p.text) # 出力: これは記事のテキスト...
重要! class_
を使うのはclass
がPythonの予約語だから、名前の衝突を避けるためだよ。
4. 条件付きでデータを抽出する練習
今度は実践だよ!たとえば、たくさん繰り返し出てくるHTML配列から記事のリンクやタイトルを抽出する必要があるとしよう。こんなデータ構造でやってみよう:
<div class="articles">
<div class="article">
<h2 class="title">最初の記事</h2>
<a href="https://example.com/1" class="read-more">続きを読む</a>
</div>
<div class="article">
<h2 class="title">2番目の記事</h2>
<a href="https://example.com/2" class="read-more">続きを読む</a>
</div>
</div>
タイトルやリンクを抽出するコードはこんな感じに:
html_doc = """<div class="articles">
<div class="article">
<h2 class="title">最初の記事</h2>
<a href="https://example.com/1" class="read-more">続きを読む</a>
</div>
<div class="article">
<h2 class="title">2番目の記事</h2>
<a href="https://example.com/2" class="read-more">続きを読む</a>
</div>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
title = article.find('h2', class_='title').text
link = article.find('a', class_='read-more')['href']
print(f"タイトル: {title}, リンク: {link}")
# 出力:
# タイトル: 最初の記事, リンク: https://example.com/1
# タイトル: 2番目の記事, リンク: https://example.com/2
5. 注意すべきこと
こうして知識を手に入れたところで、よくあるエラーもチェックしてこう。一番ありがちな間違いは、存在しない属性にアクセスしようとすること。
その場合、Pythonはちょっとフレンドリーだけどやっぱり不快なKeyError
を返すよ。それを避けるために.get()
メソッドを使って、
デフォルト値を指定しながら属性を取得するといい。
それと、HTML要素が入れ子構造になってたり、複雑な構造を持ってたりすることも忘れないでね。ブラウザのページソースビューアーを使って、
構造をよく理解してからBeautifulSoup
でデータを抽出するのがコツ。
次はCSSセレクタを使ってさらに精密な抽出をしていくよ!だから、次のBeautifulSoup
の冒険もお楽しみに!
GO TO FULL VERSION