0Pricing
Python Academy · レッスン

BeautifulSoup による HTML の解析

解析ツリーをたどり、セレクターでデータを抽出します。

「BeautifulSoup による HTML の解析」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

BeautifulSoupのインストール

beautifulsoup4 はHTMLとXMLを解析します。速度を重視する場合は lxml パーサーを、依存関係を追加したくない場合は html.parser を使います。

# pip install beautifulsoup4 lxml
from bs4 import BeautifulSoup

html = "<h1>Hello</h1><p class='intro'>World</p>"
soup = BeautifulSoup(html, "lxml")
print(soup.h1.text)   # Hello

要素の検索

find(tag) は一致する最初の要素を返します。find_all(tag) は一致するすべての要素をリストで返します。

from bs4 import BeautifulSoup

html = "<ul><li>A</li><li>B</li><li>C</li></ul>"
soup = BeautifulSoup(html, "lxml")
print(soup.find("li").text)       # A
print([li.text for li in soup.find_all("li")])  # [A,B,C]

CSSセレクター

soup.select("css selector") はCSS構文を使います。soup.select_one() は最初に一致した要素を返します。

from bs4 import BeautifulSoup

html = '<div class="card"><a href="/p/1">Link 1</a></div>'
soup = BeautifulSoup(html, "lxml")
print(soup.select("div.card a")[0]["href"])   # /p/1
print(soup.select_one("a")["href"])          # /p/1

属性へのアクセス

タグの属性には辞書のようにアクセスできます。tag["href"] や tag.get("class", []) のように記述します。

from bs4 import BeautifulSoup

html = '<a href="https://example.com" class="link external">Click</a>'
soup = BeautifulSoup(html, "lxml")
a = soup.find("a")
print(a["href"])           # https://example.com
print(a.get("class", [])) # ['link', 'external']

解析ツリーの移動

.parent、.children、.next_sibling、.previous_sibling を使ってツリーをたどります。

from bs4 import BeautifulSoup

html = "<div><h2>Title</h2><p>Para</p></div>"
soup = BeautifulSoup(html, "lxml")
h2 = soup.find("h2")
print(h2.parent.name)         # div
print(h2.next_sibling.text)   # Para (next sibling)

テキストの抽出

tag.get_text(separator=" ", strip=True) は、タグ内のすべてのテキストを返します。空白も整理されます。

from bs4 import BeautifulSoup

html = "<div>  <p>Hello</p>  <p> World </p>  </div>"
soup = BeautifulSoup(html, "lxml")
print(soup.div.get_text(separator=" ", strip=True))
# Hello World

requests + BeautifulSoupによるスクレイピング

requestsでページを取得し、BeautifulSoupで解析します。これは定番のスクレイピングの組み合わせです。

import requests
from bs4 import BeautifulSoup

url = "https://books.toscrape.com"
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, "lxml")

titles = [h3.find("a")["title"] for h3 in soup.select("article.product_pod h3")]
print(titles[:3])

相対URLの処理

urllib.parse.urljoin(base, href) を使って、相対リンクを絶対URLに変換します。

from urllib.parse import urljoin
base = "https://example.com/products/"
href = "../about"
print(urljoin(base, href))   # https://example.com/about

エンコーディングの処理

BeautifulSoupはエンコーディングを自動検出しますが、明示的に指定したり、requestsの r.encoding を使ったりすることもできます。

import requests
from bs4 import BeautifulSoup

r = requests.get("https://example.com")
print(r.encoding)   # e.g. utf-8
soup = BeautifulSoup(r.content, "lxml", from_encoding=r.encoding)

変更とシリアライズ

解析ツリーを変更し、str(tag) または soup.prettify() を使ってHTMLに戻します。

from bs4 import BeautifulSoup

html = "<p>Hello <b>world</b></p>"
soup = BeautifulSoup(html, "lxml")
soup.b.decompose()   # remove the <b> tag
print(str(soup.p))   # <p>Hello </p>

BeautifulSoupの限界

BS4は静的HTMLを解析しますが、JavaScriptは実行できません。JavaScriptで描画されるページにはPlaywrightまたはSeleniumを使います。

# BeautifulSoup: good for static HTML
# Playwright: for JavaScript-rendered SPAs
# Scrapy: for large-scale crawls with pipelines

# pip install playwright
# playwright install
# from playwright.async_api import async_playwright

確認問題

BeautifulSoupでCSSセレクターに一致するすべての要素を返すメソッドは何ですか。

復習

BeautifulSoupはHTMLをたどれるツリーに解析します。タグの検索には find()/find_all()、CSSセレクターには select()、整形されたテキストの取得には get_text() を使います。静的なページにはrequestsを組み合わせ、JavaScriptで描画されるコンテンツにはPlaywrightを使います。

よくある質問

「BeautifulSoup による HTML の解析」レッスンは無料ですか?

はい。「BeautifulSoup による HTML の解析」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「BeautifulSoup による HTML の解析」で何を学びますか?

解析ツリーをたどり、セレクターでデータを抽出します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「BeautifulSoup による HTML の解析」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. requests と httpx による HTTP リクエスト
  2. BeautifulSoup による HTML の解析
  3. Scrapy スパイダーの作成
  4. JavaScript とスクレイピング対策への対応
← Python Academyに戻る