gdap
@gdap (gdap)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Seleniumで取得したデータをfor文で一つずつ取り出したい

やりたいこと

Seleniumで下記のサイトからスクレイピングしようとしています。

該当するソースコード

from selenium.webdriver import Chrome, ChromeOptions
import time
import re

options = ChromeOptions()

driver = Chrome(options=options)

driver.get('https://nba.rakuten.co.jp/games/22200952')
time.sleep(2)

click_elem = driver.find_element_by_xpath('//*[@id="App"]/div[2]/div[2]/div/div[1]/div/div[7]/div/div[1]/div/div[3]/div/div/h2')

click_elem.click()
time.sleep(2)

timelines = driver.find_elements_by_css_selector("#App > div.App-content > div.App-main > div > div.lDefaultMain.lDefault-main > div > div.pGamesDetail-main > div > div.bTabsBody > div > div > div > div > div > div > div.GamePlayByPlayList-main > div:nth-child(1) > div > div > div.bAccordionBody > div > div.GamePlayByPlayTimeLine-allList-body > ul")

for timeline_li in timelines:
    i = 2
    timeline = timeline_li.find_elements_by_css_selector(f"li:nth-child({i}) > div > div.GameCard4 > p")
    i += 1
    time.sleep(2)

for i in range(len(timeline)):
    print(timeline[i].text)

driver.quit()

結果

Jump Ball Jackson Jr. vs Jackson Jr. (Gordon gains possession)

解決したいこと

for timeline_li in timelines:
    i = 2
    timeline = timeline_li.find_elements_by_css_selector(f"li:nth-child({i}) > div > div.GameCard4 > p")
    i += 1
    time.sleep(2)

for i in range(len(timeline)):
    print(timeline[i].text)

このソースコードから、実況のページのStart Periodから下に続くテキストを一つずつ取り出していきたいのですが、上記の結果のように1つ目のテキストしか取得できませんでした。

・1つ目のテキストしか取り出せない理由
・解決策、アドバイス
があれば是非教えてください。

0

1Answer

driver.find_element_by_xpath
driver.find_elements_by_xpath

webdriverはdocument.getElementByIdとdocument.getElementsByNameを踏襲してます。私はsのみ利用し、[0]を付加してます。

nth-child({i})を使うと、1つに固定されますよ

s付けてます。

click_elem = driver.find_elements_by_xpath('//*[@id="App"]/div[2]/div[2]/div/div[1]/div/div[7]/div/div[1]/div/div[3]/div/div/h2')
timelines = driver.find_elements_by_css_selector("#App > div.App-content > div.App-main > div > div.lDefaultMain.lDefault-main > div > div.pGamesDetail-main > div > div.bTabsBody > div > div > div > div > div > div > div.GamePlayByPlayList-main > div:nth-child(1) > div > div > div.bAccordionBody > div > div.GamePlayByPlayTimeLine-allList-body > ul")

どちらも、真面目に階層を一つ一つ定義する必要ありませんよ! divや>及び[n]は省略しても良いでしょう。中抜き大賛成!

timelines = driver.find_elements_by_css_selector("#App ul")

htmlを構成するタグをチョイスして、最終目的タグ、h2,ulを特定出来そううな、中間タグを前置しながら、トライ&エラーで微調整して下さい。

1Like

Comments

  1. @gdap

    Questioner

    回答ありがとうございます。おかげで解決できました。

Your answer might help someone💌