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

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

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

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

Q&A

解決済

1回答

1273閲覧

Python スクレイピング時に要素が取得できない(Selenium)

fukumon

総合スコア1

Python

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

0グッド

0クリップ

投稿2024/02/26 12:33

実現したいこと

スクレイピングの練習でGithubからトレンドになっている情報を取得し、CSVに保存しようとしていますイメージ説明

発生している問題・分からないこと

上の画像でプログラミング言語を表示しているテキスト部分を取得しようしているのですが、要素が取得できず、空のデータが入ってしまいます。

リスト型でまとめて要素を取得して、テキストデータを抽出しようとしたのですが、データが入っていないのでIndexError: list index out of rangeになり

該当のソースコード

Python

1import time 2import pandas as pd 3from selenium import webdriver 4from selenium.webdriver.common.by import By 5from webdriver_manager.chrome import ChromeDriverManager 6from pathlib import Path 7 8SLEEP_TIME = 3 9CSV_NAME = Path("./output") 10CSV_NAME.mkdir(exist_ok=True) 11CSV_NAME = "./output/github_ranking.csv" 12 13if __name__ == '__main__': 14 try: 15 driver = webdriver.Chrome() 16 url = "https://github.com/trending" 17 driver.get(url) 18 time.sleep(SLEEP_TIME) 19 20 result = list() 21 box_row_elements = driver.find_elements(By.CLASS_NAME, 'Box-row') 22 23 for i_box in box_row_elements: 24 row_data = dict() 25 row_data["title"] = i_box.find_element(By.TAG_NAME, 'h2').text 26 row_data["url"] = i_box.find_element(By.TAG_NAME, 'h2').find_element(By.CLASS_NAME, 'Link').get_attribute("href") 27 lang_elements = i_box.find_elements(By.CSS_SELECTOR, 'div.f6 color-fg-muted mt-2 > span.d-inline-block ml-0 mr-3') 28 29 row_data["lang"] = lang_elements[1].text 30     ↑IndexErrorが発生 31 32 result.append(row_data) 33 34 pd.DataFrame(result).to_csv(CSV_NAME) 35 36 finally: 37 driver.quit()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

「Python selenium find_element 要素取得できない」など検索し、要素がまだ表示されていないかもしれないので数秒待機させたり、画面を大きくしてみたりしましたが上手く行きませんでした。
他にもiframeやjavaScriptの要素の可能性もあったので確認しましたが、違うっぽい?

補足

初心者で拙い文章で申し訳ありませんが、ご回答いただけるとありがたいです。

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

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

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

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

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

otn

2024/02/26 13:02

見つからないという driver.find~~ の直前で print(driver.page_source)してみると、原因が切り分けられると思います。そこに無いものは取れません。
otn

2024/02/26 14:22 編集

失礼しました。最初の find_elements の事かと思ったけど、2つめの find_elements だったんですね。 ( for の中は全部 find_element かと思ってよく見てませんでした) > 「Python selenium find_element 要素取得できない」など検索し 検索するとお書きのような原因が並べられていると思いますが、 実際には取得できない原因の大部分は「指定の誤り」でしょうね。
fukumon

2024/02/26 13:14

ご指摘ありがとうございます おっしゃる通り指定方法が間違えていました スペースを「.」に置き換えることを知らずに色々試してみましたが初歩に躓いていました
otn

2024/02/26 14:19

要素を指定するには、極単純なケースを除き、 ・CSSセレクターの知識 ・XPathの知識 のすくなくとも一方が必要です。 > スペースを「.」に置き換えることを知らずに 特定の前提条件の下での対応方法だけを記憶してもあまり意味が無いです。
guest

回答1

0

ベストアンサー

クラス名にスペースが含まれる場合は、スペースを . で置き換えます。(f6 color-fg-muted mt-2 => f6.color-fg-muted.mt-2) また、言語タグが無い場合がありますので(例えば ashishps1 / awesome-system-design-resources)、その場合は空欄にします。

python

1 for i_box in box_row_elements: 2 row_data = dict() 3 row_data["title"] = i_box.find_element(By.TAG_NAME, 'h2').text 4 row_data["url"] = i_box.find_element(By.TAG_NAME, 'h2').find_element(By.CLASS_NAME, 'Link').get_attribute("href") 5 lang_elements = i_box.find_elements(By.CSS_SELECTOR, 'div.f6.color-fg-muted.mt-2 > span.d-inline-block.ml-0.mr-3') 6 row_data["lang"] = lang_elements[0].text if lang_elements else "" 7 result.append(row_data) 8 9 pd.DataFrame(result).to_csv(CSV_NAME) 10 finally: 11 driver.quit()

github_ranking.csv

csv

1,title,url,lang 20,WongKinYiu / yolov9,https://github.com/WongKinYiu/yolov9,Python 31,massgravel / Microsoft-Activation-Scripts,https://github.com/massgravel/Microsoft-Activation-Scripts,Batchfile 42,ollama / ollama,https://github.com/ollama/ollama,Go 53,vvbbnn00 / WARP-Clash-API,https://github.com/vvbbnn00/WARP-Clash-API,Python 64,qarmin / czkawka,https://github.com/qarmin/czkawka,Rust 75,mttaggart / I-S00N,https://github.com/mttaggart/I-S00N, 86,MHSanaei / 3x-ui,https://github.com/MHSanaei/3x-ui,JavaScript 97,jellyfin / jellyfin,https://github.com/jellyfin/jellyfin,C# 108,google / gemma.cpp,https://github.com/google/gemma.cpp,C++ 119,EbookFoundation / free-programming-books,https://github.com/EbookFoundation/free-programming-books, 1210,public-apis / public-apis,https://github.com/public-apis/public-apis,Python 1311,gunnarmorling / 1brc,https://github.com/gunnarmorling/1brc,Java 1412,KillianLucas / open-interpreter,https://github.com/KillianLucas/open-interpreter,Python 1513,ossu / computer-science,https://github.com/ossu/computer-science, 1614,mouredev / Hello-Python,https://github.com/mouredev/Hello-Python,Python 1715,ashishps1 / awesome-system-design-resources,https://github.com/ashishps1/awesome-system-design-resources, 1816,state-spaces / mamba,https://github.com/state-spaces/mamba,Python 1917,laurent22 / joplin,https://github.com/laurent22/joplin,TypeScript 2018,OpenCodeInterpreter / OpenCodeInterpreter,https://github.com/OpenCodeInterpreter/OpenCodeInterpreter,Python 2119,zksync / credo,https://github.com/zksync/credo, 2220,google / highway,https://github.com/google/highway,C++ 2321,Azure / PyRIT,https://github.com/Azure/PyRIT,Python 2422,huntabyte / shadcn-svelte,https://github.com/huntabyte/shadcn-svelte,Svelte 2523,Pythagora-io / gpt-pilot,https://github.com/Pythagora-io/gpt-pilot,Python 2624,glfw / glfw,https://github.com/glfw/glfw,C

投稿2024/02/26 12:52

melian

総合スコア21118

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

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

fukumon

2024/02/26 13:03

回答ありがとうございます!! クラス名にスペースがある場合は「.」で置き換えると上手く行きました また、自分が取得しようとしていたタグが他の要素にないことを見逃していたので対応策も合わせて教えていただきありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問