【Python】ページ内のリンクを取得する

機能

ページ内のリンクを取得するPythonプログラムです。

指定URLのページ内リンクを取得し、リンクテキストとリンクURLの一覧をクリップボードにコピーします。

一覧はタブ区切りされているので、そのままExcelに貼り付けることができます。

読者になる  https://blog.hatena.ne.jp/stmtk358/stmtk358.hatenablog.com/subscribe?utm_campaign=subscribe_blog&utm_source=blogs_topright_button&utm_medium=button
stmtkブログ  https://stmtk358.hatenablog.com/
トップ   https://stmtk358.hatenablog.com/
Python  https://stmtk358.hatenablog.com/archive/category/Python
2021-07-13  https://stmtk358.hatenablog.com/archive/2021/07/13
【Python】テキストの各行にプレフィックスを追加する    https://stmtk358.hatenablog.com/entry/2021/07/13/080256
Python-文字列    https://stmtk358.hatenablog.com/archive/category/Python-%E6%96%87%E5%AD%97%E5%88%97

サンプル動画

youtu.be

プログラム

#! Python3
# 機能
#  ページ内のリンクを取得する
# 使い方
#  1.Pythonを実行する
# 実行コマンド
#  python link_getter.py URL
#  python link_getter.py https://stmtk358.hatenablog.com/entry/2021/07/13/080256

import re
import sys
import bs4
import requests
import pyperclip
from urllib.parse import urljoin

# ページ内のリンクを取得する関数
def get_link(url):
    # ページ取得
    res = requests.get(url)
    res.raise_for_status()

    # リンク取得
    soup = bs4.BeautifulSoup(res.text, "lxml")
    links = soup.select("a")

    keys = set()
    results = []
    for link in links:
        # リンクURL取得
        link_url = link.get("href")
        if not link_url:
            continue

        # URL補完
        if not link_url.startswith("http"):
            link_url = urljoin(url, link_url)

        # リンクテキスト取得
        link_text = link.text
        if not link_text:
            link_text = ""
        link_text = link_text.strip()
        link_text = re.sub(r"\n", " ", link_text)

        # 重複削除
        key = link_url + link_text
        if key in keys:
            continue
        keys.add(key)

        results.append({"url": link_url, "text": link_text})

    return results


# リンク一覧をクリップボードにコピーする関数
def copy_link(url):
    # リンク取得
    results = get_link(url)

    # クリップボードにコピー
    text = ""
    for result in results:
        text += result["text"] + "\t" + result["url"] + "\n"   
    pyperclip.copy(text)
    print("クリップボードにコピーしました。")


if len(sys.argv) != 2:
    sys.exit("使い方:python link_getter.py URL")

copy_link(sys.argv[1])

使い方

  1. Pythonを実行する

実行コマンド

python link_getter.py URL

requestsとbs4とpyperclipをインストールしていない場合は以下のコマンドを実行して下さい。

pip install requests
pip install beautifulsoup4
pip install pyperclip

参考文献

www.oreilly.co.jp