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 Worldrequests + 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- requests と httpx による HTTP リクエスト
- BeautifulSoup による HTML の解析
- Scrapy スパイダーの作成
- JavaScript とスクレイピング対策への対応