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>