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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

1044閲覧

Python selenium

hafuuuuu

総合スコア3

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/10/13 08:03

前提・実現したいこと

seleniumを使い、ページングのある一覧から各店舗のメニュー情報を取得したい

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

css selectorで指定している値が間違っているせい(おそらく)で各店舗の
「関連する施術メニューをもっと見る」部分のURLが取得できない。

###該当のソースコード

以下のソースコードの

elems = browser.find_elements_by_css_selector(".l-clinic-cassette clinic__buttons c-button")

の部分で記述したcss selectorが間違っており値が取得できないと思っています。
(エラーはでず、ずっと動いた状態になる)

↓↓↓

from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.common.exceptions import NoSuchElementException import pandas as pd from time import sleep options = Options() options.add_argument('--headless') browser = webdriver.Chrome(path) pageURL = 'https://clinic.beauty.hotpepper.jp/TB023/prefecture13/' browser.get(pageURL) sleep(3) elem_urls=[] # [関連する施術メニューをもっと見る]ボタンのURL取得 while True: elems = browser.find_elements_by_css_selector(".l-clinic-cassette clinic__buttons c-button") for elem in elems: elem_urls.append(elem.get_attribute("href")) # ページング try: next_button = browser.find_element_by_class_name('c-pagination__page-link') next_button.click() sleep(3) except Exception: #browser.quit() break print('ページ数:', len(elem_urls))

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

jupyter lab

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

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

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

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

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

otn

2021/10/13 15:26

実行が終わらないと言うことでしょうか? デバッガーを使うか、printを入れるかして、何が実行されて実行が続くのかを確認しましょう。
hafuuuuu

2021/10/14 01:43

ご回答ありがとうございます! はい、3ページしかないのですが実行が1時間以上おわらず どこでどうなっているのかわからない状態です。 Pythonをはじめてまだ三ヶ月ほどでデバッカーなどの概念もあまり理解できず、、 どこにprintやデバッカーを入れればよいか教えていただけますと幸いですm(__)m
otn

2021/10/14 01:49

じゃあ、デバッガーはとりあえず置いておいて、printでやりましょう。 各行の次に、print(1)、print(2)と順次入れれば、どの処理がどのように動いているかが表示される数字を見ればわかります。数字じゃなくてそれぞれ別の文字列でも良いですが。
hafuuuuu

2021/10/14 02:30

ご丁寧にご対応いただき感謝いたします! ご指摘いただいた内容が↓で行ったこととあっているかわかりませんがご確認いただきますと幸いですm(__)m elem_urls=[] までは問題なく動き、「# [関連する施術メニューをもっと見る]ボタンのURL取得」直下の --------------------------------------------------------- elems = browser.find_elements_by_css_selector(".l-clinic-cassette clinic__buttons c-button") print(elems) --------------------------------------------------------- としたところ, --------------------------------------------------------- [] [] [] [] [] [] [] ・ ・ ・ ・ --------------------------------------------------------- のように空の結果がずっと繰り返し返されていました。 これはcss_selectorで指定した値が間違っているから ということでしょうか。
otn

2021/10/14 03:08

そこは、そうですね。そういう要素が無いということです。 clinic__buttonsやc-buttonは、タグ名じゃなくてクラス名では? また、tryの部分はどう実行されているのでしょう?
guest

回答1

0

".l-clinic-cassette clinic__buttons c-button"

は、l-clinic-cassetteというクラスのタグの子孫のclinic__buttonsというタグの子孫のc-buttonというタグという意味ですが、これは意図通りじゃ無いでしょうね。

l-clinic-cassetteというクラスのタグの子孫のclinic__buttonsというクラスのタグの子孫のc-buttonというクラスのタグであれば、".l-clinic-cassette .clinic__buttons .c-button"です。

そうじゃなくて、class="l-clinic-cassette clinic__buttons c-button"というクラス属性を持つタグであれば、".l-clinic-cassette.clinic__buttons.c-button"です。

ただ、これらの間違いは、実行が終わらないというのとは無関係なので、実行が終わらない調査は別途必要です。
初心者にありがちなのは、「実行しているコードと、質問に掲載しているコードが異なりました!」ということですが、そのあたりは大丈夫でしょうか?

投稿2021/10/14 03:38

otn

総合スコア85901

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

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

hafuuuuu

2021/10/14 06:59 編集

ご丁寧にしていただきありがとうございます. 子孫など言葉だけで、意味がわかっていなかったので助かります! おそらくご指摘の通り「".l-clinic-cassette .clinic__buttons .c-button"」であっているはずなのですが、出力されたのは下記のような文字列でした。 <selenium.webdriver.remote.webelement.WebElement (session="3c4aa49af8ef8ad4e3f7a5e990fc6074", element="e111c7a9-c5d8-4111-9691-d3a27a64e459")> , <selenium.webdriver.remote.webelement.WebElement (session="3c4aa49af8ef8ad4e3f7a5e990fc6074", element="aed6dc67-3345-4465-b95c-5ef7c4a893eb")> , <selenium.webdriver.remote.webelement.WebElement (session="3c4aa49af8ef8ad4e3f7a5e990fc6074", element="8d8dd6d1-fe6c-4e9c-acad-16b16144ef5d")> , <selenium.webdriver.remote.webelement.WebElement (session="3c4aa49af8ef8ad4e3f7a5e990fc6074", element="96e5c352-e267-47e6-9a18-91484866870e")>, options.add_argument('--headless')  を取りブラウザでの挙動も見ていましたがページングなど含め、まったく動く様子もなかったです。。 コードは確認したところ、こちらに記載したものと同じでした。 一つの質問にこんなにお時間割いていただきありがとうございます。
otn

2021/10/14 11:00

コードが間違いなくて、プログラムがループし続けるとすると、残る可能性は、 find_element_by_class_name('c-pagination__page-link') が、次のページへのリンクじゃ無くて同じページへのリンクだとかですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問