CodeGym/コース/Python SELF JA/HTMLタグと属性からデータを抽出する

HTMLタグと属性からデータを抽出する

使用可能

1. HTMLツリーをナビゲートする

今日はHTMLツリーの神秘的な世界に飛び込んで、本物のプログラミング忍者みたいにウェブページから情報を抽出するスキルを身につけるよ。マジックツールの BeautifulSoupを使い続けて、必要なデータを見つけ出し、すでにクールなスクリプトにさらに機能性を追加するぜ!では、キーボードを準備して、スタート!

まずデータを抽出する前に、HTMLツリーが何なのかをもう一度考えよう。それを巨大な「家系図」みたいにイメージしてみて。各タグが家族の一人ひとりみたいなもの。親、子、兄弟姉妹がいる。 私たちのタスクはこの「家族」の中から特定の人を見つけて、大切な家宝(データ)を丁寧に取り出すことだ。

こんなふうに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()は、まるで検索ブルドーザーみたいに すべての要素を掘り起こしてくれる。

python
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. 属性で要素をフィルタリングする

タグ検索をマスターしたから、次はidclassのような属性を使って要素をフィルタリングする方法を学ぼう。 これらの属性は、ページのしおりの役割を果たしていて、どれが重要か一目でわかるよ。

HTML
<div class="article">
    <h2 id="title">タイトル</h2>
    <p class="content">これは記事のテキスト...</p>
    <a href="https://example.com" class="link">続きを読む</a>
</div>
Python
# 特定の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配列から記事のリンクやタイトルを抽出する必要があるとしよう。こんなデータ構造でやってみよう:

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>

タイトルやリンクを抽出するコードはこんな感じに:

Python
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の冒険もお楽しみに!

1
タスク
Python SELF JA,  レベル 31レッスン 3
ロック未解除
HTMLタグからのテキスト抽出
HTMLタグからのテキスト抽出
2
タスク
Python SELF JA,  レベル 31レッスン 3
ロック未解除
属性から情報を抽出する
属性から情報を抽出する
3
タスク
Python SELF JA,  レベル 31レッスン 3
ロック未解除
ネストされた要素からのテキストの抽出
ネストされた要素からのテキストの抽出
4
タスク
Python SELF JA,  レベル 31レッスン 3
ロック未解除
複雑なHTML構造から情報を抽出する
複雑なHTML構造から情報を抽出する
コメント
  • 人気
  • 新規
  • 古い
コメントを残すには、サインインしている必要があります
このページにはまだコメントがありません