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

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

Python SELF JA
レベル 31 , レッスン 3
使用可能

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

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION