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

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

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

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

Q&A

解決済

1回答

202閲覧

pythonにおける対象要素のcssセレクタ取得方法

mastaka

総合スコア3

Python

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

0グッド

0クリップ

投稿2023/08/15 13:48

実現したいこと

以下の競艇のHPから、特定の艇番のimgファイル名をもとに該当する艇番のスタートタイムを取得する
https://www.boatrace-fukuoka.com/modules/yosou/

前提

競艇のHPから各艇のスタートタイム等を取得するプログラムを作成しています。
1~6号艇が全て順番通りのコースでスタートするわけではないため、各艇のimgファイル名(緑色の6号艇なら"boart6"がimgファイル名に含まれる)をもとにその艇のスタートタイムを取得したいです。

以下の流れで対象の艇のスタートタイム取得を考えています。(例:3日目1Rの直前情報から緑色の6号艇のスタート展示のスタートタイムを取得する場合)
6号艇の画像("boart6"がimgファイル名に含まれる)を見つける→その要素のcssセレクタを取得→取得したcssセレクタの一部を修正すればその艇のスタートタイムのcssセレクタになるので、それを利用してスタートタイムを取得

そのために対象の艇の画像を表示している要素のcssセレクタを取得しようとしても上手く取得できません。

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

None

該当のソースコード

python

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3from selenium.webdriver.chrome.service import Service as ChromeService 4from webdriver_manager.chrome import ChromeDriverManager 5from selenium.webdriver.support.ui import WebDriverWait 6from selenium.webdriver.support import expected_conditions as EC 7 8driver_22 = webdriver.Chrome(service=ChromeService(ChromeDriverManager("114.0.5735.90").install())) 9url_22 ='https://www.boatrace-fukuoka.com/modules/yosou/' 10driver_22.get(url_22) 11 12#レース日を選択 13race_date_22 = f"#yosou_block > div.tab_nthday > ul > li:nth-child(3)" 14race_date_select_22 = driver_22.find_element(By.CSS_SELECTOR, race_date_22) 15race_date_select_22.click() 16 17#レースNoを選択 18race_no_22 = f"#yosou_block > div.tab_race > ul > li:nth-child(1)" 19race_select_22 = driver_22.find_element(By.CSS_SELECTOR, race_no_22) 20race_select_22.click() 21 22tyokuzenzyouhou_22 = "#yosou_block > div.yosou_block_inner > div.tab_type > ul > li:nth-child(2)" 23tyokuzenzyouhou_select_22 = driver_22.find_element(By.CSS_SELECTOR, tyokuzenzyouhou_22) 24tyokuzenzyouhou_select_22.click() 25 26#直前情報のタブを表示 27WebDriverWait(driver_22, 15).until(EC.presence_of_all_elements_located) 28iframe = driver_22.find_element(By.CSS_SELECTOR, "#yosou_block > div.yosou_block_inner > div.yosou_contents > iframe") 29driver_22.switch_to.frame(iframe) 30 31#↓この部分の記載について問題点をご教示いただきたいです 32element = driver_22.find_element(By.CSS_SELECTOR, '[src*=boart6]').get_attribute('css_selector') 33print(element)

試したこと

cssセレクタの取得方法について調べた結果、上記のコードに辿り着いたのですがcssセレクタを取得できずに困っています。
(スタートタイムを取得するために他にもっと楽な方法がありましたらご提案いただけると幸いです)

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

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

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

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

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

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

melian

2023/08/15 14:41

アイコン画像の URL を取得したいのであれば以下の様になるかと。 element = driver_22.find_element(By.CSS_SELECTOR, 'img[src*="boart6"]').get_attribute('src')
meg_

2023/08/15 16:43

> cssセレクタの取得方法について調べた結果、上記のコードに辿り着いた どうやって「上記のコードに辿り着いた」のか教えていただけますか?
mastaka

2023/08/16 10:48

お二人ともコメントありがとうございます。 解決いたしました!
guest

回答1

0

ベストアンサー

cssセレクタを取得できずに困っています

find_element で取得した要素のcssセレクター(find_element(By.CSS_SELECTOR,~~)に書けばその要素が見つかる物)をプログラムで取得するという方法はありません。CSSセレクターはHTMを見て自分で書く物です。

おそらくやりたいことは、目的の要素Xを一度で指定する方法がないので、関連した別の要素Yを見つけて、そのYからの相対的な位置にあるXを指定するということでしょうね。
サンプルとしては、

HTML

1<div> 2 <img src="boart6.jpg"> 3 <div>~~</div> 4 <a href="~~">~~</a> 5</div>

で、imgboart6をキーに兄弟のaを取得するには、

Python

1Y = driver.find_element(By.CSS_SELECTOR, "img[src*=boart6]") 2X = Y.find_element(By.XPath,"../a")

です。XPathだと相対パスを細かく書けます。
Y.find_element(By.XPath,"..")で1行目のdiv"../a"でそのdivの直下のaです。
aが複数あって何番目か以外に区別する手段が無い場合は"../a[1]"とか、find_elementsで全部取得して希望の物を探すとか。

投稿2023/08/16 07:57

otn

総合スコア86307

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

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

mastaka

2023/08/16 10:47

ご教示いただいた内容で試したところ、欲しい情報を取得することができました! XPATHについても理解が深まったので今後も活用していきたいと思います! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問