導入
取れたデータは、そのままだと使いにくいことがよくあります。リンクが相対パスだったり、文字の前後に余計な空白や改行が入っていたり。最後のひと手間で整えます。
説明
from bs4 import BeautifulSoup
from urllib.parse import urljoin
base = "https://example.com/list"
html = """
<a href="/items/apple"> りんご
</a>
<a href="../items/orange">みかん</a>
"""
soup = BeautifulSoup(html, "html.parser")
for a in soup.find_all("a"):
text = a.text.strip() # 前後の空白・改行を除去
url = urljoin(base, a.get("href")) # 相対URL → 絶対URL
print(f"{text} : {url}")
a.text.strip()… 文字列の前後の空白・改行・タブを取り除きます。HTMLの整形で入った余白を消す定番です。urljoin(base, href)… 基準URL(いま見ているページ)と相対パスを合わせて、完全なURLを組み立てます。/items/appleや../items/orangeを正しく解決してくれます。
実行結果:
りんご : https://example.com/items/apple
みかん : https://example.com/items/orange
urljoin は「/ 始まりはドメイン直下」「../ は1つ上の階層」といったルールを自分で計算せずに済ませてくれます。リンク集めでは必須の道具です。
やってみよう
a.text.strip() の .strip() を外すと、りんごの前後に空白や改行が残ることが分かります。スクレイピングで取れた文字列は「まず strip()」を癖にすると、後の処理がきれいになります。
演習
base を "https://shop.example.com/page/2" に変えて実行し、相対パスがその新しいドメインに合わせて解決されることを確かめてください。
ヒント1を見る
base の文字列を書き換えるだけです。urljoin が新しいドメインを基準に絶対URLを作り直します。