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

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

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

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

VBA

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

Q&A

1回答

1712閲覧

VBAスクレイピングで同じクラス名の複数のテーブルを読み込むときの対応

TeruakiKozu

総合スコア36

スクレイピング

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

VBA

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

0グッド

0クリップ

投稿2021/06/18 23:25

すみません、情報収集用のファイルを作っているのですが、同じページにテーブルクラスの名前が複数ダブっているときに、一番上のテーブルしか読み込んできません。

取得先は例えば https://keiyaku.city.fukuoka.lg.jp/contract/
VBAコードは
Sub 福岡市入札情報一覧取得()
Dim myDriver As New WebDriver
Dim myTable As WebElement
Dim myTDs As WebElements
Dim myTD As WebElement
Dim myRowNo As Integer
Dim i As Integer
With myDriver
.Start "edge"
.Get "https://keiyaku.city.fukuoka.lg.jp/contract/"
Set myTable = .FindElementByCss(".dataBox")
myRowNo = 2
i = 1
Set myTDs = myTable.FindElementsByTag("td")
For Each myTD In myTDs
Cells(myRowNo, i).Value = myTD.Text
i = i + 1
If i = 50 Then
i = 1
myRowNo = myRowNo + 1
End If
Next
.Close
End With
Set myDriver = Nothing
End Sub

これだと結果が現在結果が一般競争入札の「現在公告している案件はありません。」のみ表示されます。
その下のテーブルも同時に取得することはできないものでしょうか?
なにとぞご教授くださいませ。

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

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

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

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

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

guest

回答1

0

.FindElementByCss(".dataBox") だと該当する最初の要素しか取得できません。

.FindElementsByCss(".dataBox") というようにsを付けるとコレクション(複数の要素)として取得できますので、それを For Each でまわせばいいでしょう。

次のFor Each myTD In myTDsで For Each は使っているので、使いかたは分かりますよね。

投稿2021/06/19 02:30

hatena19

総合スコア34064

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

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

TeruakiKozu

2021/06/20 21:43 編集

ありがとうございます。For each でどうやって回すのかがわかりません。色々やってみましたがエラー頻発で、恐縮ですがご教授いただけますか?複数要素までは通ったようです。
hatena19

2021/06/21 01:52 編集

下記のような感じでどうでしょう。 For Each myTable In .FindElementsByCss(".dataBox") myRowNo = 2 i = 1 Set myTDs = myTable.FindElementsByTag("td") For Each myTD In myTDs '中略 Next Next
TeruakiKozu

2021/06/21 11:13

なるほど、試してみます。m(__)m
TeruakiKozu

2021/06/21 22:44

hatena19様 試してみました が、読み込みがところどころずれるのと、読みこんでいないパートがあるようです。 あと、下から読みに行っているようで、上の物は読み込みませんでした。 間違えている所がありましたら、恐縮ですがご教授ください。 =======================以下コード Sub 表組みデータ取り込み() Dim myDriver As New WebDriver Dim myTable As WebElement Dim myTables As WebElements Dim myTDs As WebElements Dim myTD As WebElement Dim myRowNo As Integer Dim i As Integer Dim s As Integer With myDriver .Start "edge" .Get "https://keiyaku.city.fukuoka.lg.jp/contract/" For Each myTable In .FindElementsByCss(".dataBox") myRowNo = 2 i = 1 Set myTDs = myTable.FindElementsByTag("td") For Each myTD In myTDs Cells(myRowNo, i).Value = myTD.Text i = i + 1 If i = 6 Then i = 1 myRowNo = myRowNo + 1 End If Next Next .Close End With Set myDriver = Nothing End Sub
hatena19

2021/06/22 01:41

一応読み込みができているということなので、For Each の部分の問題ではないと思います。 中のロジックの問題では。 ざっと見た感じでは、 For Each myTable In .FindElementsByCss(".dataBox") myRowNo = 2 i = 1 の部分、ループで繰り返すたびに同じ値を入力しているので、同じ場所に上書きしていることになっています。
TeruakiKozu

2021/06/22 05:11

なるほどそういうことですか。ありがとうございます。何となく解決方法わかりました。やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問