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

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

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

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

selenium

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

Q&A

解決済

1回答

2524閲覧

Webスクレイピングで店舗検索を行いたい

asuka1273

総合スコア10

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2019/06/30 11:44

前提・実現したいこと

seleniumを使って次のWebページ(https://www.sej.co.jp/shop/)の「住所から探す」のテキストボックスに特定のキーワードを入力して、店舗一覧を表示させるプログラムを作成しているのですが、以下のエラーメッセージが発生しました。

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

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".formAddrW"}

該当のソースコード

driver = webdriver.Chrome() driver.get('https://www.sej.co.jp/shop/') time.sleep(5) element1 = driver.find_element_by_class_name('formAddrW') element2 = element1.find_element_by_class_name('keyword') element2.send_keys('豊島区') element2.submit()

補足情報

他のサイト(ファミリーマートやローソン)では上記と同様なコードで実行してエラーが発生しませんでした(find_element_by_class_nameの()内のみ変更)。

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

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

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

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

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

guest

回答1

0

ベストアンサー

※修正しました

イメージ説明

該当箇所の html を上図に載せています。

element1 は、クラス名(class 属性)ではなく、 name 属性 がformAddrW ですので、
find_element_by_class_name ではなく、 find_element_by_name を使います。
element2 も同様に、クラス名ではなく、 name 属性が keyword ですので、find_element_by_name を使います。

python

1element1 = driver.find_element_by_name('formAddrW') 2element2 = element1.find_element_by_name('keyword')

とすることで動作するかと思います。

コメントを受けて追記

探しているform (element1) がiframe の中に存在しているため、iframe の中を探すようにしなければなりませんでした。

以下で動作することを確認しました。

python

1import time 2from selenium import webdriver 3 4driver = webdriver.Chrome() 5driver.get('https://www.sej.co.jp/shop/') 6time.sleep(5) 7 8# iframe の中にフォーカスを切り替える 9iframe = driver.find_element_by_css_selector('iframe[src="//www.e-map.ne.jp/p/711map/?p_s1=40000"]') 10driver.switch_to_frame(iframe) 11 12element1 = driver.find_element_by_name('formAddrW') 13element2 = element1.find_element_by_name('keyword') 14element2.send_keys('豊島区') 15element2.submit() 16

投稿2019/06/30 11:50

編集2019/06/30 12:46
nunukim

総合スコア135

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

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

asuka1273

2019/06/30 12:01 編集

回答ありがとうございます。 ご指摘いただいた箇所を修正しましたが、上記と同様のエラーメッセージが発生しました。
nunukim

2019/06/30 12:01

どちらの行でのエラーしょうか? `element1 = driver.find_element_by_class_name('formAddrW')` の行を `element1 = driver.find_elements_by_class_name('formAddrW')` にしてしまっていませんか?(element とelements の違い)
asuka1273

2019/06/30 12:04

コメントありがとうございます。「elements」にして試行した際に発生したエラーメッセージを誤って送ってしまいました。失礼しました。 実際には質問内に上げたものと同様のエラーメッセージが発生しました。
nunukim

2019/06/30 12:17

失礼しました。element1 の方のエラーだったのですね。 回答を修正しました。
asuka1273

2019/06/30 12:28

回答ありがとうございます。ご指摘いただいた箇所を修正したところ、新たに次のようなエラーメッセージが発生しました。 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="formAddrW"]"}
nunukim

2019/06/30 12:47

どうやら、form 全体がiframe の中にあることが問題のようです。 回答に追記しました。
asuka1273

2019/06/30 12:58

追記ありがとうございます。無事、動作しました。 度重なるご回答、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問