Q&A

回答の並べ替え:
投稿新規に質問を投稿する

同一構造のコンポーネントが複数表示されている画面から情報を取得する方法について

k_shimizu k_shimizu

2019-08-08 19:41

https://developer.celf.biz/questions/3778/
上記リンク先にて、情報の取得に関して質問したのですが、改めて質問させてください。

同一構造のコンポーネントが複数表示されている場合に、該当箇所全てから文字を取得したいと考えています。
ループ処理などが利用できればできるのではないかと考えているのですが、実現に困っています。

ロボットタブのアクションに「指定された画像が一致する全ての位置に対して以下を行う」というものがありました。
ただ、画像比較による判定では実行する度に判定結果が異なってしまい、利用は難しいと判断しました。

上記以外に、ループ処理で複数箇所から取得する方法はありますでしょうか。
よろしくおねがいします。

k_shimizu k_shimizu
>kurata様
解決策までご提示して頂き、ありがとうございます!

CELFには構造を利用してループ処理を行うようにはなっていなさそうなのですね。。
実現のため、ご提示頂いた案を参考に検討したいと思います。
kurata kurata
メダルベストアンサー
「あなたへのおすすめ」記事の箇所のHTML
画像で「1記事」と図示した部分(dl~dl)が、記事ぶん繰り返されている構造になっています。
そして、HTMLを見ると、その親属性としてdivタグに「qurioArticleBd」というidがあります。
つまり、この部分を捕捉して、中身のリストをループでぐるぐる回したら記事を順番に取得できる、というわけです。

ところが、残念ながら、CELFの構造解析は、このの構造を取得してくれるようにはなっていないようなのです。
だからCELFでこの箇所をまとめて取得することができないのです。

ExcelVBAでこの箇所をループ処理で取得する操作を書くと、このようになります。
(おそらく、この処理の流れが、お考えの手順と一番近いのではないでしょうか)

Sub getYahooOsusume()

Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

objIE.navigate "http://www.yahoo.co.jp/"
Call IEWait(objIE)

Dim i As Long: i = 1
Dim objdd As Object

For Each objdd In objIE.document.getElementById("qurioArticleBd").getElementsByClassName("recTxt")
ThisWorkbook.Worksheets("Sheet1").Cells(i, 1) = objdd.innerText
i = i + 1
Next

objIE.Quit
Set ObjIE = Nothing

End Sub

Function IEWait(ByRef objIE As Object)
Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop
End Function

UiPathだと、このような構造であれば表データとしてまとめて取得できます。
(操作としては、CELFで「ニュース」欄をまとめて取得したのと同じような感じ)

なので、解決方法としては
・CELFでやりたい→記事を1個ずつ取得するようにアクションを書く
・ループ処理を使いたい→ExcelVBA
・まとめて取りたい→UiPathなど他のRPAツールで取得することを検討する

VBAでデータを取得しておいて、ExcelもしくはcsvにしてからそのデータをCELFに渡す、というような方法だったら他のツールも入れないで済むし、まとめて取得できて連携しやすいかもしれません。