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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

selenium

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

Q&A

解決済

2回答

7184閲覧

Selenium VBAでのデータ取得②

Nitta

総合スコア96

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

selenium

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

0グッド

0クリップ

投稿2019/07/22 23:42

編集2019/07/25 01:29

お世話になっております。
今、あるタグ内のテキストデータ(図の赤字の部分)を取得したいのですが
上手く取得できません。
下記コードのどこが悪いのでしょうか?
お分かりの方居られましたら、ご教示下さい。

Dim elements, elements2, get_click As WebElements Set elements = Driver.FindElementsByTag("tr") For ix0 = 1 To elements.Count  If elements2.Item(ix0).FindElementsByCss(" td.stCenter > a > span").Text = "在庫△ 取り置き可" Then   >>ジュンク堂書店の部分 Mydata1=elements2.Item(ix0).FindElementsByCss(" td.stCenter > a > span").Text   >>店舗名の部分   Mydata2=elements2.Item(ix0).FindElementsByCss("td:nth-child(2) > a").Text   >>店舗名の住所部分   Mydata3=elements2.Item(ix0).FindElementsByCss("td:nth-child(3)").Text   goto BB  End if Next BB:

結果
Mydata1="",Mydata2="",Mydata3=""

イメージ説明

●フラッシュメッセージの図
イメージ説明

以上、よろしくお願いします!
助けてください!

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそもなぜCSSで選択しようとするのでしょう…
タグやXPathで取ってくれば早いですよ。

VBA+SeleniumBasic

1 2 Dim elements, elements2 3 '該当テーブルのTRを取得(ポイントはElement"s") 4 Set elements = Driver.FindElementByXPath("//*[@id=""anc01""]/div[2]/table").FindElementsByTag("tr") 5 'データの数だけループ 6 For Each elements2 In elements 7 '見出し行でないかの確認 8 If elements2.FindElementsByTag("th").Count = 1 Then 9 Debug.Print elements2.FindElementsByTag("th")(1).Text '書店 10 Debug.Print elements2.FindElementsByTag("td")(1).Text '店舗名 11 Debug.Print elements2.FindElementsByTag("td")(2).Text '住所 12 Debug.Print elements2.FindElementsByTag("td")(3).Text '営業時間 13 Debug.Print elements2.FindElementsByTag("td")(4).Text '在庫状況 14 End If 15 Next elements2 16

FindElement と FindElements の違いが重要です。
Elementだと最初の1つとってくるのでそのままアクセスできますが、
Elementsの場合は複数とってくる(配列になる)ので中身のアクセスには添字が必要です。

コード見ればなんとなく理解はしてもらえると思いますがわからなければこの回答にコメントで。

それと goto 文で無理やり For 文を抜けてるところですが、
Exit For というのがありますのでそれで抜けたほうが良いです。

XPathの取得の仕方などは「XPath Chrome 取得」等でググレばたくさん出てきます。

投稿2019/07/23 03:43

shinobu_osaka

総合スコア456

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

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

Nitta

2019/07/24 01:02

返信ありがとうございます。 無事何とか納品できました! XPathについては、取得方法はわかります。 CssでなくXpathでないとFindElementsByTag("tr")ができなかったんですが、 それで間違いないんですかね?
shinobu_osaka

2019/07/24 02:32

いえ、それは単に elements に入れてるのに elements2 にアクセスしてるという単純な記述ミスかと、 そことその後は FindElements でいくのなら添字が抜けてるとかもありますね、 その2点を修正すればとりあえず動く…かも? さらにforループをgotoで抜けるとループが終了しないので繰り返すごとにメモリにゴミが溜まり、 コーディングによっては最終的にエラーになるかもです、exit for で抜けましょう。 ついでですが For ix0 = 1 To elements.Count で elements2.Item(ix0) へアクセスするより For Each elements2 In elements で elements2 へのアクセスで確実に全部ループできますし、 スタートの値の指定がいらない、余計な変数がいらない等の利点があり、 見た目がスッキリするのでおすすめです。
Nitta

2019/07/24 07:19

返信ありがとうございます。 分かりやすい解説有難うございます。 VBAの正規表現って得意ですか?
shinobu_osaka

2019/07/24 07:22

VBAには正規表現はありませんので、 VBScriptのRegExpオブジェクトを使用して行います、 使い心地は…まぁ他の言語と似たり寄ったりですかね? 得意不得意というと…正規表現の記述自体はまぁまぁ得意です。 何がしたいのでしょうか?
Nitta

2019/07/25 01:19

返信ありがとうございます。 例えばG(F)の文字から始まる文字をヒットさせるには どのような記載をすればいいのでしょうか? 自分は下のように記載しましたが、 上手くヒットできませんでした! "^G(F).*?" 後、もう一つフラッシュメッセージのボタンをクリックする コードはどんな感じですか? 上記、図添付します。 宜しくお願い致します。
shinobu_osaka

2019/07/25 01:23

正規表現では括弧は特殊文字ですのでエスケープする必要があります、エスケープした例 "^F(F).*?" どのような文字にエスケープが必要かは「正規表現 エスケープ]などでググってください。 フラッシュメッセージというのがなんのことかわからないので図を待ちます。
Nitta

2019/07/25 01:31

返信ありがとうございます。 了解です! 図は↑の●フラッシュメッセージの図になります。
shinobu_osaka

2019/07/25 02:28

ああ、JavascriptのAlertですね、driver.SwitchToAlert.Accept でOKできます。
Nitta

2019/07/28 23:10

返信おくれすいません! 返信ありがとうございます。 なるほどです。VBAでも色々なスクレイピングできることが わかりありがたかったです! また、今後とも宜しくお願い致します。
guest

0

デバッグする手順としては、
まず、if の条件が成立したときに、elements2.Item(ix0)になにが入ってるのか確認してみることですね

投稿2019/07/23 00:03

y_waiwai

総合スコア87747

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

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

Nitta

2019/07/23 01:15

返信ありがとうございます。 いや、まず成立してないんです! 指定方法が間違っているのですか?
y_waiwai

2019/07/23 02:27

成立してないってことがわかってるなら、 elements2.Item(ix0).FindElementsByCss(" td.stCenter > a > span").Text になにが入ってるかリストアップしてみればどうでしょう で、あなたの目的とするものにマッチさせるにはどうすればいいかを考えましょう
Nitta

2019/07/28 23:11

返信ありがとうございます。 返信遅れすいませんでした。 この件、問題解決できました。ありがとうございます。 また、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問