🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

selenium

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

Q&A

解決済

1回答

1365閲覧

seleniumで複数要素を取得したい

ycarp3340

総合スコア4

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

selenium

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

0グッド

0クリップ

投稿2021/01/01 09:28

編集2021/01/01 11:37

前提・実現したいこと

個人的趣味でプロ野球データの収集を行おうと思っているのですが、
要素の取得の部分で躓き上手くいきません。

複数要素をそれぞれfor文にて抽出を図ったのですが、
csvで出力すると球種、球速、結果が同じものになってしまいます。
イメージ説明

球種、球速、結果の部分を正確に反映できるようにしたいです。

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

エラーメッセージ

該当のソースコード

python3.9

1from selenium import webdriver 2import chromedriver_binary 3import time 4import csv 5import datetime 6 7driver = webdriver.Chrome() 8driver.get('https://baseball.yahoo.co.jp/npb/game/2020061903/score?index=0110100') 9 10csv_date = datetime.datetime.today().strftime("%Y%m%d") 11csv_file_name = "carp_data_" + csv_date + ".csv" 12f = open(csv_file_name, "w", encoding="CP932", errors="ignore") 13 14writer = csv.writer(f, lineterminator="\n") 15csv_header = ["球数", "投手", "球種", "球速", "結果", "コース"] 16writer.writerow(csv_header) 17 18i = 0 19item = 1 20while True : 21 i = i + 1 22 time.sleep(5) 23 for elem_ta in driver.find_elements_by_xpath('//*[@id="gm_rslt"]/tbody/tr'): 24 print(elem_ta.text) 25 for elem_tb in driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[3]'): 26 print(elem_tb.text) 27 for elem_tc in driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[4]'): 28 print(elem_tc.text) 29 for elem_te in driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[5]'): 30 print(elem_te.text) 31 for elem_td in driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[1]/tbody/tr/td/div/span'): 32 pitch_position = elem_td.get_attribute('style') 33 print(pitch_position) 34 csvlist = [str(item), elem_ta.text, elem_tb.text, elem_tc.text, elem_te.text, elem_td.get_attribute("style")] 35 writer.writerow(csvlist) 36 item = item + 1 37 next_link = driver.find_element_by_id('btn_next') 38 driver.get(next_link.get_attribute('href')) 39 if i > 1: 40 break 41driver.close()

試したこと

for文の変数をelem_tdにしてみましたが、うまくいかず…
イメージ説明

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

forが5つ並んでいますが、4つのループが回り終わって、最後の項目を変数に保持している状態で、5つ目のループを回しているので、elem_td以外の項目は最後の項目になります。

Python

1for i in range(5): 2 print(i) #=> 0 1 2 3 4 を表示 3 4#この時点で i は 4 5for j in range(5): 6 print(i) #=> 4 4 4 4 4 を表示

#追記
元のコードのテイストを残して書き換え。
ループを一緒に回ります。

Python

1i = 0 2item = 1 3while True : 4 i = i + 1 5 time.sleep(5) 6 elem_ta = driver.find_element_by_xpath('//*[@id="gm_rslt"]/tbody/tr') 7 elems_tb = driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[3]') 8 elems_tc = driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[4]') 9 elems_te = driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[3]/tbody/tr/td[5]') 10 elems_td = driver.find_elements_by_xpath('//*[@id="pitchesDetail"]/section[2]/table[1]/tbody/tr/td/div/span') 11 for elem_tb, elem_tc, elem_te, elem_td in zip(elems_tb, elems_tc, elems_te, elems_td): 12 print(elem_ta.text) 13 pitch_position = elem_td.get_attribute('style') 14 print(pitch_position) 15 csvlist = [str(item), elem_ta.text, elem_tb.text, elem_tc.text, elem_te.text, elem_td.get_attribute("style")] 16 writer.writerow(csvlist) 17 item = item + 1 18 next_link = driver.find_element_by_id('btn_next') 19 driver.get(next_link.get_attribute('href')) 20 if i > 1: 21 break 22driver.close()

投稿2021/01/01 09:57

編集2021/01/01 12:13
otn

総合スコア85888

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

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

ycarp3340

2021/01/01 11:39

ご回答ありがとうございます。 変数を全てelem_tdにして試したのですが、「試したこと」のような状態になってしまいました。 具体的にどこをどのように変更すればよいのでしょうか?
otn

2021/01/01 11:43

変数名の違いが原因だと思ってしまったのでしょうか。 forが終わっていることが原因です。 と言っても分からないですよね。追記してみます。
ycarp3340

2021/01/01 12:23

勉強不足で申し訳ありません。 頂いたコードで試したら出来ました! わざわざありがとうございました。 先にそれぞれを定義しておいて、zipで括ればよかったんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問