コード一覧

【Python】BeautifulSoupを使ってURLとタイトルを一緒に取得する方法

URLとタイトル名を取得する方法

動画サイトなどは、URLとタイトル名が同じクラスの中にあるため、クラスのテキストを単純に取得しただけでは、綺麗なデータを取得できません。
どちらかをid名やclass名だけを取得する方法は検索してもヒットしましたが、一緒に取得してしまうので、それをどうやってきれいにするのかは、ヒットしずらかったので残しておきます。

まずは、全体のコード(URLとクラス名の〇〇〇の部分を任意のモノに変更したら動く)

from bs4 import BeautifulSoup
import urllib.request as req

# 〇〇〇へアクセス
url ="https://任意のURL"
res = req.urlopen(url)
soup = BeautifulSoup(res,"html.parser")

# <div class="〇〇〇".....>URLやタイトル名の情報<div>のクラス名を指定
tags = soup.find_all(class_="〇〇〇")
 
#  find_allはリスト形式で取得されるので、forで順番に取り出す。
# ポイントは取り出した情報からさらにタグ名を絞ってforで取り出すこと。
for tag in tags:
    # 一つづつ取り出した〇〇〇クラスの中の"a"タグの情報を取得
    for a in tag.select("a"):
        # aタグの中の title="タイトル名" というようなtitle=のあとの情報を取得する
        title_name = a.get('title')
        print(title_name)
        # aタグの中の href="リンク先のURL" というようなhref=のあとの情報を取得する
        url = a.get('href')
        print(url)

BeautifulSoupとrequestsをimportする

from bs4 import BeautifulSoup
import urllib.request as req

モジュールをインポートする

手順ごとの解説

# 〇〇〇へアクセス
url ="https://任意のURL"
res = req.urlopen(url)
soup = BeautifulSoup(res,"html.parser")

任意のURLを指定して、URLを開けて、HTMLの情報を取得してくる。

# <div class="〇〇〇".....>URLやタイトル名の情報<div>のクラス名を指定
tags = soup.find_all(class_="〇〇〇")

例えば以下のような情報なら、classの〇〇〇には、titleと指定する。
<span class="title">
<a href="〇〇〇URL〇〇〇"  title="タイトル名" class="" >テキスト</a>
</span>
そうすると、上記の上方がすべて取得される。
しかし、欲しい情報は、URLとタイトル名のテキストなので、タグはいらない。
そこで、タグを外してURLとタイトル名を取得するためのコードが以下。

# 取得したclass="title"で始まるクラスがリスト形式でtagsに格納されている
for tag in tags:
    # 一つづつ取り出した〇〇〇クラスの中の"a"タグの情報を取得
    for a in tag.select("a"):
        # aタグの中の title="〇〇〇" というようなtitle=のあとの情報を取得する
        title_name = a.get('title')
        print(title_name)
        # aタグの中の href="〇〇〇" というようなhref=のあとのURLを取得する
        url = a.get('href')
        print(url)

for tag in tags:でクラスを1ブロックごとに取り出して、tagに入れる。
次に、for a in tag.select("a")をしている。
これは、<a></a>タグの情報を取得する。という意味。
つまり、titleクラスの中に入っているaタグの情報を取得しています。という意味。

a.get('title')は、aタグの中のtitle="〇〇〇"を取得するという意味。
<a href="〇〇〇URL〇〇〇"  title="タイトル名" class="" >テキスト</a>
</span>

url = a.get('href')は、aタグの中のhref="〇〇〇"の情報を取得するという意味
<a href="〇〇〇URL〇〇〇"  title="タイトル名" class="" >テキスト</a>
</span>