本文へスキップ
BecomeCoder

Pythonスクレイピングコース · 第3章 CSSセレクタと構造をたどる · レッスン9

入れ子を指定する ― 子孫セレクタ

ブラウザで完結

導入

article の中の見出しだけ」のように、構造の位置で絞りたいことがあります。セレクタをスペースでつなぐと、入れ子の関係を表現できます。

説明

from bs4 import BeautifulSoup

html = """
<nav>
  <a href="/home">ホーム(メニュー)</a>
</nav>
<article>
  <a href="/post/1">記事へのリンク</a>
  <a href="/post/2">別の記事へ</a>
</article>
"""

soup = BeautifulSoup(html, "html.parser")

# article の中の <a> だけを取る(nav の中のリンクは除外される)
links = soup.select("article a")
for a in links:
    print(a.text, a.get("href"))
  • "article a" … 「<article> の中にある <a>」という意味(スペースが「〜の中の」を表す)。
  • これにより、<nav> の中のメニューリンクは取らず、記事本文のリンクだけを集められます。

実サイトはメニュー・広告・本文などリンクだらけです。「どの親要素の中か」で絞ると、狙ったリンクだけを正確に取れます。

やってみよう

"article a""nav a" に変えると、今度はメニューのリンク(ホーム)だけが取れます。同じ <a> でも「どの入れ子の中か」で取り分けられることを確かめましょう。

演習

上の HTML から、<article> の中のリンクの href だけを1行ずつ print してください。

ヒント1を見る

for a in soup.select("article a"): print(a.get("href"))

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、本物の BeautifulSoup(Pyodide)でHTMLの解析をその場で試せます。初回だけ読み込みに少し時間がかかります。本文のHTMLを書き換えたり、抜き出すタグを変えたりして、結果の変化を確かめましょう(ネットからの取得は第5章の読み物で解説します)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。