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

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

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

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

selenium

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

Q&A

解決済

1回答

1466閲覧

(VBA:Selenium)srcの要素をExcelに貼り付けたい

club33gold

総合スコア20

VBA

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

selenium

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

0グッド

0クリップ

投稿2023/02/27 04:50

編集2023/02/27 09:17

実現したいこと

VBAのSelenium(Webdriver)を使用し、srcの要素をExcelに貼り付けたいです。
ブラウザはEdgeになります。

前提

①item-brandは、添付資料の内容で抽出が出来ました。

Dim brand ' As WebElements Set brand = driver.FindElementsByClass("item-brand") Set ws = ActiveWorkbook.ActiveSheet Dim j As Long For j = 1 To brand.Count ws.Range("B" & j + 4).Value = brand.Item(j).Text() Next

 ②item-phの src=に記載されたアドレスを抽出したいのですが、この部分だけが分かりません。
https://www.abcdef.jp~~~~~~~/336336-m.jpgの文字列を引用したいです。

 ●item-brandを参考として、作成したのが下記のコードです。

Dim image Set image = driver.FindElementsByClass("item-ph") For j = 1 To brand.Count Debug.Print image.Item(j).Text() ws.Range("F" & j + 4).Value = image(j).Attribute("src") Next

 ②【※追記】下記の様にCss+imgタグでの引用ですと、イメージが近いです。
ただし商品情報以外でhtmlの上の方にimgタグがあり、そちらの情報から引用がされています。
class="tile-image" に紐付くscr情報のみを抽出したいです。

Set image = driver.FindElementsByCss("img") For j = 1 To brand.Count ws.Range("F" & j + 4).Value = image(j).Attribute("src") Next

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

・動作はしますが、エラーメッセージもなく、何も抽出されません。

該当のソースコード

<figure class="item-ph">
<a href="/detail/336336.html"> <img class="tile-image" src="https://www.abcdef.jp/on/demandware.static/-/Sites-lightup-master-catalog/default/dw61c2dcf9/medium-2/336336-m.jpg" alt="快適フィットのハイソールスニーカー" title=""/> </a>
</figure> <div class="item-icon">
<span class="item-icon__black">当社限定商品</span>
</div> <div class="item-brand"><a href="/detail/336336.html">ミスキョウコ</a></div> <div class="item-name">
<a href="/detail/336336.html">快適フィットのハイソールスニーカー</a>
</div>
<div class="item-price"> <a href="/detail/336336.html">19,800円</a> </div>

試したこと

・下記のサイトを参考にし、### 前提②に記載したコードを作成しました。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14234135644
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13234316793

https://vba-create.jp/vba-selenium-data-download/

https://vba-create.jp/vba-selenium-get-url-href/

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

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

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

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

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

otn

2023/02/27 10:55

image.countの値は確認してないのでしょうか??
club33gold

2023/02/27 10:58

結果的にはbrand.Countと同じ値になる様にしたいので、そのまま使用しています。
otn

2023/02/27 11:02

image.countの値は確認してないのでしょうか?YES/NO
otn

2023/02/27 11:23

①と②のコードは1つのプログラムの中で繋がって書かれているということで合ってますか?
club33gold

2023/02/27 12:08

はい、繋がって書かれているという事で合っています。
otn

2023/02/27 13:10

念のための確認ですが、on error resume next とかは無いですよね?
club33gold

2023/02/27 13:17

はい、on error resume next はありません。
otn

2023/02/27 13:31

②が実行されて、debug.printの出力も無く、image.Item(j) のjの範囲エラーも無く ということからは、brand.Count が 0 であることが結論づけられるわけですが、 それの直前の①の処理で、ワークシートが更新されているということと矛盾しますので、どこかの記述が間違っています。 1回目に①の部分だけで実行して更新した同じワークシートを、①+②を合わせた2回目のプログラムの実行でもそのまま使っていて、実は1回目に更新したデータを見て、2回目でも更新されたと思っていると言うことはないでしょうか? つまり、1回目と2回目で更新対象を別ワークシートにしているか、または同じワークシートなら、毎回ワークシートのその部分をクリアしてから実行しているかと言うことですが。
club33gold

2023/02/27 14:10

・brand.Count に誤りはないと思われます。  記載はしていませんが、item-brandの他にitem-price等も、brand.Count を使用しています。  結果として、本文の最後に記載したhtmlより問題なく取得~Excelにアウトプット出来ています。 ・~~~実は1回目に更新したデータを見て、2回目でも更新されたと思っていると言うことはないでしょうか? →こちらもございません。  理由は下記に記述致します。 ・①②の更新対象は同じワークシートです。  driver.FindElementsByCss("img")の使用で要素の取得~F5へのデータの貼り付けは行えています。  ただし参照範囲がimgタグのため、img class="tile-image" src=以外の部分にあるimgタグの付いたsrc要素も取得している形になります。  仮にimage.Countを使用した場合はbrand.Countより大きい数になりますが、brand.Countの個数までしか取得していません。  不要なデータが入っておりますので、そちらを除外するような構文、もしくは"tile-image"を持つリストの取得が出来ればと考えています。
otn

2023/02/27 15:55 編集

> 理由は下記に記述致します。 何故「下記」が理由になるのかわかりません。全く関係ない事柄に見えます。 同じワークシートとのことですが、プログラム実行前、ないし、プログラムの冒頭で毎回クリアしているのでしょうか?してないのであれば、 > 実は1回目に更新したデータを見て、2回目でも更新されたと思っていると言うことはないでしょうか? という疑いが残ります。毎回クリアーしてないなら、しましょう。
club33gold

2023/02/28 00:32

回答を頂きました内容に誤りがあり、失礼致しました。 プログラム実行前、ないし、プログラムの冒頭で毎回クリアしています。 そのため実は1回目に更新したデータを見て、2回目でも更新されたと思っていると言う事はございません。
otn

2023/02/28 00:58 編集

どこかに誤りがあることは確実なので、デバッグとしては、 ・誤りの可能性のあるポイントをリストアップ ・そのポイントを1つ1つ確認して、間違いないことを想像でなく直接確認 ・間違いが見つからなければ、ポイントのリストアップ漏れか、確認間違いがあるので、最初に戻る を間違いが見つかるまで繰り返すことになります。 デバッガーで1ステップずつ各種変数の状態やブラウザ開発者ツール画面を確認しながら進めるのでしょうか。 現象からは、 ・image.Countがゼロだったのでは無いか?(この場合エラーが出るはずだがエラーを握りつぶしてないか?) ・brand.Countがゼロだったのでは無いか? (①と②の実行の関係が不明だった) を疑ったのですが。
club33gold

2023/02/28 01:03

FindElementsByCss("img")~にてimage.Count、brand.Countともに0ではないです。 (※Debug.printにて確認済) おそらくの原因としては、本文記載の通り参照の範囲かと思われます。 ●やりたい事> <img class="tile-image" src=***">の***部分のみ取得したい ●試した事> CSSで(img)の要素を取得 ただし他にもimgタグがあり、正しい情報が取得出来ない。
club33gold

2023/03/07 07:09

回答が遅くなりまして、申し訳ありませんでした。 hawawa 様のコードで無事に解決に至りました! この度は貴重なアドバイスをご教示頂きまして、誠にありがとうございました。
guest

回答1

0

ベストアンサー

以下のコードでどうでしょうか?

src属性はimg要素に設定されていて、figure要素の属性ではないです。
質問者さんの追記前のコードだとfigure要素の存在しないsrc属性を取得しようとしていることになると思います。

attributeの戻り値ちょっと調べてみましたがgoogleで調べても見つかりませんでした。
推測ですが、attributeで存在しない属性を取得しようとすると空文字が返されるのではないでしょうか。

VBA

1Dim image 2 3 Set image = driver.FindElementsByClass("item-ph") 4 5 For j = 1 To brand.Count 6 7 Debug.Print image.Item(j).Text() 8 ws.Range("F" & j + 4).Value = image(j).FindElementByTag("img").Attribute("src") 9 Next

投稿2023/02/28 04:57

編集2023/02/28 05:15
hawawa

総合スコア79

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問