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

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

新規登録して質問してみよう
ただいま回答率
85.46%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

Q&A

解決済

1回答

1937閲覧

Excel VBA スクレイピングでidやnameタグが無いclassの下のclassが取得できない

masa1975

総合スコア22

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

VBA

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

0グッド

0クリップ

投稿2020/09/17 01:11

編集2020/09/17 04:44

閲覧いただきありがとうございます。
今現在、スクレイピングの勉強をしているのですが、あるサイトでデータの抜き方がわからずに困っています。

HTML

1<div class=aaa> 2 <div class=bbb> 3 <table> 4 <tbody> 5 <tr class=ccc>... 6 </tr> 7 <tr>...</tr> 8 <tr class=ddd> 9  <td>最低</td> 10  <td>金額</td> 11 <tr class=ddd> 12  <td>最高</td> 13  <td>金額</td> 14 <tr class=ddd> 15  <td>平均</td> 16  <td>金額</td> 17 </tbody> 18 </table> 19 </div> 20</div> 21 22<div class=eee> 23 <div class=bbb> 24 <table> 25 <tbody> 26 <tr class=ccc>... 27 </tr> 28 <tr>...</tr> 29 <tr class=ddd> 30  <td>最低</td>  ←この最低と下の金額が抜きたい。 31  <td>金額</td> 32 <tr class=ddd> 33  <td>最高</td> 34  <td>金額</td> 35 <tr class=ddd> 36  <td>平均</td> 37  <td>金額</td> 38 </tbody> 39 </table> 40 </div> 41</div> 42 43

上のような構図になっているのですが

Excel

1 2Dim tr As HTMLTable 3Dim tm As HTMLTable 4 5For Each tr In objIE.getElementsByClassName("eee") 6 7 For Each tm In tr.objIE.getElementsByTagName("td") 8 9 If tm.innerText = "最低" Then 10 11 Debug.Print tm.innerText 12 13 14 15 End If 16 17 Next 18 19 Next tr

としたところ、実行時エラー438と出てしまいます。
何故でしょうか?
ご教授いただけましたら幸いです。
お願いいたします。
---追記---
変更後のコードになります。

VBA

1 2Dim tr As Object 3Dim tm As Object 4 For Each tr In objIE.getElementsByClassName("eee") 5 6 For Each tm In tr.getElementsByTagName("td") 7 8 If tm.innerText = "最低" Then 9 10 MsgBox tm.innerText 11 12 13 14 End If 15 16 Next tm 17 18 Next tr

エラー内容
実行時エラー438
このオブジェクトは、このプロパティまたはメソッドをサポートしていません。
でした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

vba

1'Dim tr As HTMLTable 2'Dim tm As HTMLTable 3'上記の tr tm はTableではない 4'tr は getElementsByClassName("eee") で <div class=eee> を取得しているのでdiv要素 5'tm は getElementsByTagName("td") で取得しているので td要素 6'よって下記に修正 7Dim tr As HTMLDivElement 8Dim tm As HTMLTableRow 9'上記で多分あっていると思うが記憶違いかあるかも、いちいち調べるのか面倒なら、 10Dim tr As Object 11Dim tm As Object 12'と宣言しておけばOK 13 14For Each tr In objIE.getElementsByClassName("eee") 15 16' For Each tm In tr.objIE.getElementsByTagName("td") 17'.objIE は不要 18 For Each tm In tr.getElementsByTagName("td") 19 If tm.innerText = "最低" Then 20 21 Debug.Print tm.innerText 22 23 24 25 End If 26 27 Next 28 29 Next tr

とりあえずこれでエラーはなくなるはず。

投稿2020/09/17 01:43

編集2020/09/17 01:49
hatena19

総合スコア33790

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

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

masa1975

2020/09/17 03:41

早速の回答ありがとうございます。 ご指摘いただいた場所を変更後動かしてみたのですが、やはり同じエラーが発生してしまいます。 (1回目のFor Each tr In objIE.getElementsByClassName("eee")でエラーになってしまいます。)
hatena19

2020/09/17 03:45 編集

Dim tr As Object Dim tm As Object に変更しましたか。 また、エラーメッセージはなんでしょうか。
masa1975

2020/09/17 04:03

教えて頂いた個所はすべて変更いたしました。 エラーに関しましては同じく438になります。
hatena19

2020/09/17 04:13

エラー番号ではなく、エラーメッセージはなんでしょうか。番号のあとにテキストが表示されてますよね。 念のために修正後のコードを質問に追記してもらえますか。
masa1975

2020/09/17 04:44

修正後のコードと、エラー内容を追記させていただきました。
hatena19

2020/09/17 04:55

なるほど、下 objIE.getElementsByClassName("eee") を objIE.document.getElementsByClassName("eee") に変更したらどうなりますか。
masa1975

2020/09/17 08:04

ありがとうございます。 無事、値を取得することが出来ました!(^^)!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問