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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

Q&A

解決済

2回答

1685閲覧

seleniumを使ったスクレイピング

NEKOTABETAI

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

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

0グッド

0クリップ

投稿2022/05/23 03:55

編集2022/05/23 03:58

前提

Python 3.9.7 (anaconda3使用)でwebから要素をとってくるプログラムを作っています。
以下のエラーメッセージが発生しました。
不慣れなので必要な情報が抜けているかもしれません。

実現したいこと

以下のサイトから、マップ名(devツールで見てみると 'map-title'のクラスがついています)と、ローテーション時間(同様に 'map-countdown'のクラスがついています)をテキストとして取り出したいです。

https://apexmap.kuroi.io/

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

どこからが必要な情報かがわからないのでターミナルをコピペしました。
見ずらくて申し訳ないです。
INUDOGはユーザー名です(笑)

(py39) C:\Users\INUDOG\OneDrive\ドキュメント\my python projects>C:/Users/INUDOG/anaconda3/envs/py39/python.exe "c:/Users/INUDOG/OneDrive/ド キュメント/my python projects/test.py" c:\Users\INUDOG\OneDrive\ドキュメント\my python projects\test.py:10: DeprecationWarning: use options instead of chrome_options driver = webdriver.Chrome('C:/Program Files (x86)/selenium/chromedriver',chrome_options=options) DevTools listening on ws://127.0.0.1:59180/devtools/browser/2d328c73-125b-440e-ac5a-6fb866e6a794 Traceback (most recent call last): File "c:\Users\INUDOG\OneDrive\ドキュメント\my python projects\test.py", line 13, in <module> map = driver.find_element_by_xpath('//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]') File "C:\Users\INUDOG\anaconda3\envs\py39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath) File "C:\Users\INUDOG\anaconda3\envs\py39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element return self.execute(Command.FIND_ELEMENT, { File "C:\Users\INUDOG\anaconda3\envs\py39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute self.error_handler.check_response(response) File "C:\Users\INUDOG\anaconda3\envs\py39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]"} (Session info: headless chrome=101.0.4951.67)

該当のソースコード

python

1from lib2to3.pgen2 import driver 2from webbrowser import Chrome 3from selenium import webdriver 4from selenium.webdriver.common.keys import Keys 5from selenium.webdriver.chrome.options import Options 6 7options = Options() 8options.add_argument('--headless') 9driver = webdriver.Chrome('C:/Program Files (x86)/selenium/chromedriver',chrome_options=options) 10driver.get('https://apexmap.kuroi.io/br') 11 12map = driver.find_element_by_xpath('//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]') 13countdown = driver.find_element_by_xpath('//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]/div[1]') 14 15print(map + countdown)

試したこと

最初はクラス名で探していたのですが、見つからないとエラーが返ってきたのでxpathでやってみましたができませんでした。
headlessオプションでは未確認ですが、headlessオプション無し時に10行目までは正しく動作したのを確認しています。(目的のページを開けたということ)

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

本題に関係するかわからないのですが、上記のリンクはそのリンク先に飛ぶと、末尾に 'br' が追加されhttps://apexmap.kuroi.io/brとなります。
なぜこのようなことが起きるのですか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

https://apexmap.kuroi.io/br に直接アクセスしてみるとエラーになります(404 Not Found)。URL を元の https://apexmap.kuroi.io/ に変更してみます。

python

1#driver.get('https://apexmap.kuroi.io/br') 2driver.get('https://apexmap.kuroi.io/') 3 4time.sleep(3) 5 6maps = driver.find_element_by_xpath('//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]') 7countdown = driver.find_element_by_xpath('//*[@id="app-shell"]/div[2]/app-br-map-rotation/app-br-rotation/app-map-rotation/div/app-hero/div/div[2]/div[1]') 8 9print(maps.text) 10print(countdown.text) 11 12# 13World's Edge 141:04:04 15Check Map 16Ranked 171:04:04

投稿2022/05/24 02:27

melian

総合スコア19849

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

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

NEKOTABETAI

2022/05/24 02:57

回答ありがとうございます。とても助かりました。 urlとprint関数のほうに問題があったのですね。盲点でした。
guest

0

エラーメッセージは、「そんな要素は無い」という意味なので、
(英語がわからないなら、翻訳サイトを使いましょう)
XPathの指定が間違っています。
そんな長いXPathを指定しないといけないというのは普通ではないですが、再度考え直してはどうでしょうか?

まあ、このまま進むのであれば、
'//*[@id="app-shell"]'から順に、この要素が見つかるかどうかみて、
見つかれば次は'//*[@id="app-shell"]/div[2]'といい風に1つずつ延ばしていきます。
見つからなくなった時点で、その周辺のHTMLを見直します。

投稿2022/05/23 14:23

otn

総合スコア84710

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

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

NEKOTABETAI

2022/05/23 14:54

回答ありがとうございます。エラー内容も把握しており、xpathもdevからコピーしているのでなぜ違うのかわかりません。
otn

2022/05/23 15:22

> xpathもdevからコピーしているので それが間違いの元でしょうね。 おそらく、今Seleniumで起動しているブラウザで見たのでなく、別途手動で起動したブラウザで見たのでは?
NEKOTABETAI

2022/05/23 16:28

seleniumで起動したもので確認しましたが、何も変わりませんでした。 xpathをdevからコピーするのはなにかまずいことがあるのですか?
otn

2022/05/23 23:36 編集

> seleniumで起動したもので確認しましたが、何も変わりませんでした。 「何も変わりませんでした。」というのは「全く同じXPathが得られた」という意味ですか? driver.find_element_by_xpath(~~) を実行する直前に確認しましたか? 言い換えると、XPathを確認した直後に driver.find_element_by_xpath(~~) を実行しましたか? > xpathをdevからコピーするのはなにかまずいことがあるのですか? それだと、今まさに開いているHTMLでしか通用しないXPathが得られることがあります。 例えばdiv[2] のような「何番目の要素」というのは状況によって変化する場合があります。 なので、driver.find_element_by_xpath(~~) を実行する直前にXPathを取得する必要があります。 (開発者ツールでXPathをコピペして使おうとする限りに於いてはですが) とにかく、no such element: Unable to locate element になっているからには、「driver.find_element_by_xpath(~~) を実行した時点のHTMLに指定した要素が無い」というのは確実です。 それがエラーメッセージの意味です。
NEKOTABETAI

2022/05/24 02:48

返信ありがとうございます。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問