スクレイピングを行うプログラムのコーディングをしていると、現在スクレイピング中のWebページに含まれるURLだけを取得したいときが多々あります。
ということで今回は見出しの通り、BeautifulSoupでaタグに含まれるURLだけを取得する方法を解説します。
スクレイピングでURLのみを取得する
この記事では基本編と実践編の2つに分けて解説します。解説部分では重要な部分しか載せていないので、サンプルコード全文は解説の最後にまとめて掲載しておきます。
基本編:URLをひとつだけ取得
まずは核となるような基本的なコードとその解説をします。
下記コマンドではHTMLの一番最初に出てくるaタグに含まれるhref属性(URL)を取得することができます。
from bs4 import BeautifulSoup
#変数html_soupには予め解析済みのHTMLソースコードが格納
tag_a = html_soup.select_one("a") #html_soupから一番最初に出てくるaタグを取得
url = tag_a.get("href") #tag_aに含まれるURLのみを取得
- 5行目:select_oneコマンドでhtml_soupに含まれるaタグのうち、一番最初に出てくるものを取得してtag_aに格納
- 6行目:getコマンドでtag_aのhref属性の内容を取得してurlに格納
以上のように、URLのみを取得する基本的な流れはhtml_soupからaタグを取得→href属性を参照、といった感じです。
html_soupに当ブログのトップページのHTMLのソースコードを解析したもので実行した場合のurlの中身を確認してみましょう。
print(url)
# 出力
# https://edaha-room.com
実践編:すべてのaタグからURLを取得
基本編ではHTMLのソースコードに含まれるaタグの一番上のURLしか取得することができません。ということで実践編ではWebページに含まれるURL全てを取得するコードを解説します。
from bs4 import BeautifulSoup
#変数html_soupには予め解析済みのHTMLソースコードを格納
tag_a_list = html_soup.select("a") #html_soupから全てのaタグを取得
for tag_a in tag_a_list: #取得したaタグを順番に処理
url = tag_a.get("href")
print(url)
- 5行目:selectコマンドでhtml_soupに含まれる全てのaタグを取得してtag_a_listに格納。
- 6行目:for文を回してtag_a_listに入っているaタグを順番に参照し、tag_aに格納
- 7行目:getコマンドでtag_aのhref属性の内容を取得してurlに格納
注意点としては、selectコマンドでは見つかったタグが一つでもリスト型で返すという点です。なのでhref要素を取得する際には必ずリスト中の特定要素を参照してgetコマンドを使用しましょう。
↓のようなコードだとエラーを吐きます。
#tag_a_listはリスト型なのでエラーが出る
url = tag_a_list.get("href")
サンプルソースコード
以下各サンプルコードです。chrome_pathやurlなどの変数は適宜変更してください。
基本編
from selenium import webdriver
from bs4 import BeautifulSoup
url = "https://edaha-room.com/python_selenium_page_source/1867/"
chrome_path = "chromedriverのファイルパス"
driver = webdriver.Chrome(chrome_path)
driver.get(url)
html_contents = driver.page_source
html_soup = BeautifulSoup(html_contents, "html.parser")
tag_a_list = html_soup.select("a")
for tag_a in tag_a_list:
url = tag_a.get("href")
print(url)
実践編
from selenium import webdriver
from bs4 import BeautifulSoup
url = "https://edaha-room.com/python_selenium_page_source/1867/"
chrome_path = "chromedriverのファイルパス"
driver = webdriver.Chrome(chrome_path)
driver.get(url)
html_contents = driver.page_source
html_soup = BeautifulSoup(html_contents, "html.parser")
tag_a_list = html_soup.select("a")
for tag_a in tag_a_list:
url = tag_a.get("href")
print(url)
driver.quit()
まとめ
今回はBeautifulSoupを使ってaタグに含まれるURLだけを取得する方法を解説しました。
実践編ではselectコマンドで全てのaタグを取得するようなサンプルプログラムを使いましたが、selectコマンドの引数にclassやidなどを与えるだけで任意のURLのみを取得することができると実感できたと思います!
この記事で不明な点や気になるところがあれば下のコメント欄までお願いします。それではまた!
コメント