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

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

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

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

selenium

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

Q&A

解決済

1回答

1781閲覧

【VBA:Selenium】htmlから情報を抽出したい(InvalidSelectorError)

club33gold

総合スコア20

VBA

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

selenium

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

0グッド

0クリップ

投稿2023/06/30 09:22

実現したいこと

・VBAのSelenium(Webdriver)を使用し、下記のhtmlから商品名・価格・アドレスの情報を抽出~Excelに貼付をしたいです。
(ブラウザはEdgeになります。)

前提

・商品名、アドレス部分のコーディングは出来ました。
価格部分のみ上手く取得が出来ない状況です。

 大変お手数ですが、解決策をご教示を頂けますと幸いです。

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

・実行時エラー32
InvalidSelectorError compound class name permitted
→div class、もしくはspan classの情報を抽出出来ない形です。
contentの "10267"、もしくは ¥ 10,267 を出来れば良いと考えています。

試したこと

'■03_情報の取得_01_商品名→OK Dim name ' As WebElements Set name = driver.FindElementsByClass("image-container") ws.Range("D" & n).Value = name(1).FindElementByTag("img").Attribute("title") '■03_情報の取得_02_価格→NG Dim price ' As WebElements Set price = driver.FindElementsByClass("price bx-product-tile__price") ws.Range("E" & n).Value = price(1).FindElementByTag("span").Attribute("content") '■03_情報の取得_03_サイトアドレス→OK Dim site ' As WebElements Set site = driver.FindElementsByClass("image-container") ws.Range("F" & n).Value = site(1).FindElementByTag("a").Attribute("href")

該当のソースコード

<div class="image-container">
<a href="/goods/960012.html" class="tx-product-tile-a-on " data-item-sku-group="960012" data-item-list-name="キーワード検索結果一覧_9786-33703"> <img width="400" height="400" loading="lazy" class="tile-image bx-loading-background w-100 h-auto" src="https://belluna.jp/dw/image/v2/BHHF_PRD/on/demandware.static/-/Sites-belluna_catalog-ms/default/dw521714c0/images/PIMDW/ph/O/1008826469/DLARGE.JPG?sw=198" alt="「カシオ ソーラー電波時計(腕時計)」" title="カシオ ソーラー電波時計" itemprop="image"> </a> <div class="bx-ranking mt-0"> <div class="bx-bg- bx-ranking__number-wrapper"></div> </div> <div class="bx-infomation mt-0"> </div> <div class="image-container__label"> </div> <a class="quickview bx-product-tile__label" href="/on/demandware.store/Sites-belluna-Site/ja_JP/Product-ShowQuickView?pid=960012" title="クイックビュー" data-skugroup="960012" data-quickviewitemlistname="キーワード検索結果一覧_9786-33703"> <span class="d-flex flex-column align-items-center justify-content-end bx-bg-bel-white rounded-circle bx-font-size-px-10 bx-text-bel-black3 border-bottom-0 bx-outline-bel-gray3"> <span>6</span> Colors <i class="fas fa-chevron-down"></i> </span> </a>
</div>
<div class="tile-body"> <div class="bx-text-bel-gray5 bx-font-size-px-10 bx-mb-px-1 bx-height-px-15"></div> <div class="pdp-link text-truncate bx-font-size-px-12 font-weight-normal"> <a class="link tx-product-tile-a-on " href="/goods/960012.html" data-item-sku-group="960012" data-item-list-name="キーワード検索結果一覧_9786-33703" >カシオ ソーラー電波時計</a>
</div>
<div class="price bx-product-tile__price"> <span> <span class="sales bx-product-tile__sales font-weight-normal bx-text-bel-black3"> <span class="value bx-font-size-px-12" content="10267"> &yen; 10,267 </span> <span class="mb-1 bx-font-size-px-8 ">&nbsp;(税込)</span> </span>
</span> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

InvalidSelectorError compound class name permitted

と、複数クラスを指定できないようなので、CSSで指定しましょう。
driver.FindElementsByCss(".price.bx-product-tile__price")

投稿2023/07/01 15:44

otn

総合スコア86295

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

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

club33gold

2023/07/05 05:29

確認致しました。 下記の記述を試してみましたが、エラーになってしまいます。 (※実行時エラー:1004、見つからないパラメーターには規定値がありません。) * * * * * * * * * * * * * * * * * * * * * * * * * * * Dim price ' As WebElements Set price = driver.FindElementsByCss(".price.bx-product-tile__price") ws.Range("E" & n).Value = price * * * * * * * * * * * * * * * * * * * * * * * * * * * ※他に試した事:どちらもエラーでした。> ・「.price.bx-product-tile__price"」→「price.bx-product-tile__price"」 ・「~~.Value = price」→「~~.Value = price(0)」や「~~.Value = price(1)」 大変お手数ですが、ご教示のほど、よろしくお願い致します。
club33gold

2023/07/05 05:37

失礼致しました。 自己解決出来ました。 FindElementsByTag~~~以降が抜けていた様です。 大変勉強になりまして、ありがとうございました。 ベストアンサーとさせて頂きます。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Dim price ' As WebElements Set price = driver.FindElementsByCss(".price.bx-product-tile__price") ws.Range("E" & n).Value = price(1).FindElementsByTag("span")(3).Attribute("content")
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問