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

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

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

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

selenium

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

868閲覧

(VBA:Selenium)任意の文字で始まるClassの要素をExcelに貼り付けたい

club33gold

総合スコア20

VBA

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

selenium

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/03/13 07:46

①実現したいこと

VBAのSelenium(Webdriver)を使用し、price、もしくはpriceBの情報を抽出~Excelに貼付をしたいです。
ブラウザはEdgeになります。

該当のソースコードは④に記載致します。

②前提~発生している問題~試した事

下記の様にclass item-price+class priceで始まるタグ(price*?)での引用ですと、イメージが近い様に思えます。
以前にこちらでご教示を頂きました、.Attribute()を試しています。

Dim price

Set price = driver.FindElementsByClass("item-price")

For j = 1 To num ’→ num は変数で定義していますが、実際は48として機能しています。

Debug.Print "price(" & j & ")" & "=" & price(j).Text

'試した事_01:class="ico-off"など不要な要素が抽出される

' ws.Range("E" & j + 5).Value = price(j)

'試した事_02:pタグなしのためエラーになる

' ws.Range("E" & j + 5).Value = price(j).FindElementByTag("p").Attribute("price*")

'試した事_03:対象なし
' ws.Range("E" & j + 5).Value = price(j).Attribute("price*")

Next

③補足

※For~の中に Debug.Print "price(" & j & ")" & "=" & price(j).Textを入れた場合、下記の通りに要素の全てが出力されます。
ただし欲しい情報はprice、もしくはpriceBの情報のみになります。

 price(1)_\11,550
\5,980 (税込)
48%OFF
price(2)期間限定:3/10(金)?16(木)
¥11,000
\6,600 (税込)
40%OFF
price(3)期間限定:3/10(金)?16(木)
¥22,000
\17,600 (税込)
20%OFF
price(4)
\23,800 (税込)
price(5)
\16,500 (税込)
price(6)_期間限定:3/10(金)?16(木)
¥17,900
\11,000 (税込)
38%OFF
price(7)_期間限定:3/10(金)?16(木)


※driver.FindElementsByCssの考え方が得意ではないので、可能であればAttributeを使った形ですと分かりやすいです。

④該当のソースコード

<!-- 価格情報--> <p class="item-price"> <span class="item-wrapper">

<span class="" ></span>

</span> <!-- 期間--> <span class="period-wrapper"> <!-- 期間限定価格最終日文言--> <!-- 期間限定価格文言曜日あり--> </span> <!-- 前価格--> <span class="wprice"> <span>&yen;11,550</span> </span> <!-- 現在価格-->

<span class="price">¥5,980</span>
<span class="tax">(税込)</span>
<span class="rate">
<span class="ico-off">48%OFF</span>
</span>

</p> <!-- 価格情報--> <p class="item-price"> <span class="item-wrapper"> <span class="" ></span> </span> <!-- 期間--> <span class="period-wrapper"> <!-- 期間限定価格最終日文言--> <!-- 期間限定価格文言曜日あり--> </span> <!-- 前価格--> <span class="wprice"> </span> <!-- 現在価格-->

<span class="priceB">¥23,800</span>
<span class="tax">(税込)</span>

</p>

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

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

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

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

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

guest

回答1

0

●Attributeは基本的には属性を指定して、値を取得するメソッドです。

<タグ id="hoge" 属性1="値1" 属性2="値2" 属性3="値3">テキスト</タグ>

Debug.print driver.FindElementByID("hoge").Attribute("属性1")
'出力:値1
Debug.print driver.FindElementByID("hoge").Attribute("id")
'出力:hoge

例外?
Debug.print driver.FindElementByID("hoge").Attribute("innerText")
'出力:テキスト
Debug.print driver.FindElementByID("hoge").Attribute("outerHTML")
'出力:<タグ ID="hoge" 属性1="値1" 属性2="値2" 属性3="値3">テキスト</タグ>

●Class="price"の要素にアクセスしたいのであれば
price(j)に対してもう一度FindElementByClass("price")を使います。

priceとPriceBがあるようなので要素の存在チェックをしています。

VBA

1Dim price 2 Set price = driver.FindElementsByClass("item-price") 3 4 For j = 1 To num '→ num は変数で定義していますが、実際は48として機能しています。 5 6 'MsgBox price(j).Attribute("outerHTML") 7 8 If price(j).FindElementsByClass("price").count <> 0 Then 9 'Class="price"が存在するとき 10 'MsgBox price(j).FindElementByClass("price").Attribute("outerHTML") 11 ws.range("E" & j + 5).Value = price(j).FindElementByClass("price").text 12 End If 13 If price(j).FindElementsByClass("priceB").count <> 0 Then 14 'Class="priceB"が存在するとき 15 'MsgBox price(j).FindElementByClass("priceB").Attribute("outerHTML") 16 ws.range("E" & j + 5).Value = price(j).FindElementByClass("priceB").text 17 End If 18 19 Next

投稿2023/03/13 17:00

編集2023/03/13 17:03
hawawa

総合スコア79

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問