導入
「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"))。