質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

776閲覧

Python: リスト内の複数URLの更に下層にあるページのスクレイピング

hafuuuuu

総合スコア3

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/17 11:28

前提・実現したいこと

複数のクリニックのページURLをリストに入れて、
それぞれのクリニックのもっている各プラン詳細ページの情報(プランの料金、プラン名、施術時間など)を取得したい。

リストにいれるURL例:https://clinic.beauty.hotpepper.jp/H000481998/treatment-menus/

各プラン詳細ページ例:
■上記URLの「検査」を押下した先のページ
https://clinic.beauty.hotpepper.jp/H000481998/treatment-menus/52838/?couponId=52838&cstt=1

■上記URLの「オーダーメイドAGA発毛メソセラピー」を押下した先のページ
https://clinic.beauty.hotpepper.jp/H000481998/treatment-menus/52839/?couponId=52839&cstt=2

同様に、プランは全部で9件あるので対象URLは9件

発生している問題・エラーメッセージ

リストに入れた2つのURLそれぞれが持つ
すべてのプラン詳細URLにアクセスして情報(プランの料金、プラン名、施術時間など)を取得することができてない。

おそらくループ処理がうまく行っていないのですが、回避方法がわからず。。

どなたかおわかりの方いましたらお助けいただけますと幸いです。

該当のソースコード

python

1 2from bs4 import BeautifulSoup 3import requests 4import pandas as pd 5import time 6 7links = [ 8"https://clinic.beauty.hotpepper.jp/H000481998/treatment-menus/", 9"https://clinic.beauty.hotpepper.jp/H000482096/treatment-menus/", 10] 11 12#linksに入れたURLをrequests→parser 13 14for i in range(len(links)): 15 16 r = requests.get(links[i]) 17 time.sleep(3) 18 soup = BeautifulSoup(r.text,'html.parser') 19 20 url_list= soup.find_all("a", class_ = "treatment-menu__link") 21 print(url_list) 22 23 #url_listからhref属性だけを取り出す(この時点でリストに入れた片方の詳細URLしかとれてない?) 24 urls = [] 25 for n in range(len(url_list)): 26 try: 27 link_ = url_list[n].get('href') 28 urls.append(link_) 29 except: 30 pass 31 32 #各プランの詳細ページURL生成 33 new_urls = [] 34 for i in range(5): 35 url = urls[i] 36 new_url = "https://clinic.beauty.hotpepper.jp"+url 37 print(new_url) 38 new_urls.append(new_url) 39 40 #詳細ページURLのパース 41 for n in range(len(new_urls)): 42 43 r = requests.get(new_urls[n]) 44 time.sleep(3) 45 soup = BeautifulSoup(r.text,'html.parser') 46 47 #ここから各プラン詳細ページの情報取得 48 detail = soup.find(class_ = "l-container") 49 50 plan_name = soup.find(class_ = "menu-summary__treatment-menu-name").text 51 #print(detail) 52 plan_name 53 54 55 56 #for m in range(len(detail)): 57 #name = detail[m].find(class_ = "menu-summary__treatment-menu-name").text 58 #print(name)

補足情報(FW/ツールのバージョンなど)

Google colabを使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/10/17 11:41

> 取得することができてない。 エラーメッセージが出るとか、エラーが出ないけど0件だとか、現象を書いてください。
guest

回答1

0

ベストアンサー

「#各プランの詳細ページURL生成」の行から下のネストが1段深くなってしまっているようです。
また、「for i in range(5):」でループ回数を固定しているので、参照先のリンク数が 5件未満の場合もエラーになってしまう恐れがあります。

先ず、ループの使い方を見直すと、原因となる箇所の特定にたどり着きやすくなると思います。

python

1修正前:for i in range(len(links)): 2  ↓ 3修正後:for link in links:

「リスト内の何番目を処理中か」が必要な場合は enumerate()関数 を利用すると良いですが、
今回のケースでは不要なようです。

下記に修正例を示します。参考になれば幸いです。

python

1from bs4 import BeautifulSoup 2import requests 3import pandas as pd 4import time 5 6links = [ 7"https://clinic.beauty.hotpepper.jp/H000481998/treatment-menus/", 8"https://clinic.beauty.hotpepper.jp/H000482096/treatment-menus/", 9] 10 11for link in links: 12 print('-----', link) 13 r = requests.get(link) 14 soup = BeautifulSoup(r.text,'html.parser') 15 url_list= soup.find_all("a", class_ = "treatment-menu__link") 16 #print(url_list) 17 time.sleep(3) 18 19 for i, url in enumerate(url_list): 20 if i > 5: 21 break 22 url = url.get('href') 23 new_url = "https://clinic.beauty.hotpepper.jp" + url 24 print(i, 'new_url', new_url) 25 r = requests.get(new_url) 26 soup = BeautifulSoup(r.text,'html.parser') 27 28 detail = soup.find(class_ = "l-container") 29 plan_name = soup.find(class_ = "menu-summary__treatment-menu-name").text 30 print(plan_name) 31 time.sleep(3)

投稿2021/10/17 22:58

編集2021/10/17 23:13
nemoplus

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hafuuuuu

2021/10/19 13:55

ご連絡が遅れましたがこちらでうまくいきました。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問