- 締切済み
HTMLのデータ読み取り
HTMLのデータ読み取り 下記のように記述されたホームページの一部からデータを読み取りしたいのですが いろいろ参考にしてプログラムしても構文エラーで実行できません。 WEBBROUSERを使用してHTML.DOCUMENTを取得するところまではできました。 すみませんが詳しい方教えていただけますでしょうか? VB2010を使用し、document.completeイベントにて取得しようとしています。 --------------------- <dl class="clearfix" style="padding:10px 0 0;"> <dt>現在位置 :</dt> <dd class="address"> <span class="address-now">+38</span><br /><span class="vat">(mm)</span> </dd> <dt>目標 :</dt> <dd class="target"><span class="user-target">読み込み中</span></dd> </dl> --------------------- ほしい出力 text1.text = address text2.text = +38 text3.text = target text4.text = 読み込み中 ← この値は変化しています よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
#2 の続きです。 【方法1】の文字の切り分けは、#1 さんがお書きのような「正規表現」の方が スマート なのかも知れません。 -------------------------------- '【方法1】className = "clearfix" の Element の innerHTML から、切り分けていく方法 searchClass = "clearfix" If UBound(getElementsByClass(searchClass)) = 0 Then myStr = getElementsByClass(searchClass)(0).innerHTML myStr = Right(myStr, Len(myStr) - InStr(myStr, "class") - 5) myMsg = "text1.text = " & Left(myStr, InStr(myStr, "><SPAN class=") - 1) myStr = Right(myStr, Len(myStr) - InStr(myStr, "class") - 5) myMsg = myMsg & vbNewLine & "text2.text = " & Mid(myStr, InStr(myStr, ">") + 1, InStr(myStr, "<") - InStr(myStr, ">") - 1) myStr = Mid(myStr, InStr(myStr, "class") + 5) myStr = Right(myStr, Len(myStr) - InStr(myStr, "class") - 5) myMsg = myMsg & vbNewLine & "text3.text = " & Left(myStr, InStr(myStr, "><SPAN class=") - 1) myStr = Mid(myStr, InStr(myStr, "class") + 5) myMsg = myMsg & vbNewLine & "text4.text = " & Mid(myStr, InStr(myStr, ">") + 1, InStr(myStr, "<") - InStr(myStr, ">") - 1) MsgBox myMsg Else MsgBox "className = """ & searchClass & """ の Element が複数存在します。" End If -------------------------------- '【方法2】"text1.text"・"text3.text" は決め打ち、その他は <span> タグ 内の outerText から取得 myMsg = "text1.text = address" searchClass = "address-now" If UBound(getElementsByClass(searchClass)) = 0 Then myMsg = myMsg & vbNewLine & "text2.text = " & getElementsByClass(searchClass)(0).outerText End If myMsg = myMsg & vbNewLine & "text3.text = target" searchClass = "user-target" If UBound(getElementsByClass(searchClass)) = 0 Then myMsg = myMsg & vbNewLine & "text4.text = " & getElementsByClass(searchClass)(0).outerText End If MsgBox myMsg
- DOUGLAS_
- ベストアンサー率74% (397/534)
>VB2010を使用し 私は、VB は解りませんが、回答が付かないようですので、ご参考までにご覧ください。(私の場合は、WSH や VBA で、よく同様の作業をしております)。 #回答を書いている内に、回答が付いたようですが、せっかく書いたので、恥ずかしながら投稿いたします。 #全くの見当違いな回答でしたら、お見捨てください。 -------------------------------- >下記のように記述されたホームページの一部から とのことですが、お示しの html コード だけでは、この中から、 >データを読み取りし ご要望の text を取得しようとすると、その「ホームページ」の全ての html コード の中から「<dl class= ~~」などの位置を取得して、それ以降の文字列を「文字列操作関数」で切り分けていくような段取りになるかと存じます。 -------------------------------- お示しの html コード が「name = "~~"」とか「id = "~~"」などを内包する タグ を親要素として持っている場合でしたら、 >「ホームページ」の全ての html コード ではなくて、[GetElementByName メソッド] や [GetElementById メソッド] で、その innerHTML に内容を絞り込むことはできます。 -------------------------------- あるいは、 http://blog.livedoor.jp/nipotan/archives/15424695.html をご参考に、「getElementsByClass()」でも実装させて、「className="address-now"」・「className="user-target"」の <span> タグ の outerText を取得する方法になりましょうか。。。 -------------------------------- ちなみに、 text1.text = address text3.text = target の2行につきましては、199Xnen さんの決め打ちでしたら、「取得する」のではなくて、端から text1.text = "address" text3.text = "target" のように指定すればよいだけのように存じますが。。。 -------------------------------- 'これ以下は、Excel VBA での一例です。ご参考までにご覧ください。 Option Explicit Dim objIE As Object 'IWebBrowser2 Sub Macro() Dim searchClass As String Dim myStr As String Dim myMsg As String Set objIE = CreateObject("InternetExplorer.Application") With objIE .Visible = True .navigate "下記のように記述されたホームページのURL" While .Busy Or .ReadyState <> 4: DoEvents: Wend '●● ここに【方法1】または【方法2】の コード を挿入 End With objIE.Quit Set objIE = Nothing End Sub Function getElementsByClass(searchClass) Dim allElements As Object 'DispHTMLElementCollection Dim i As Long Dim j As Integer Dim classElements() As Object Set allElements = objIE.document.getElementsByTagName("*") For i = 0 To allElements.Length - 1 If allElements(i).className = searchClass Then ReDim Preserve classElements(j) Set classElements(j) = allElements(i) j = j + 1 End If Next i getElementsByClass = classElements End Function
- buraigasho
- ベストアンサー率78% (32/41)
もし、必ず同じ場所にテキストが表示されるのなら、Mid関数で取りに行く。 絶えず変化する若しくはHTML出力される文字列が多い場合は、正規表現がよいのでは? 例 ddタグの列挙 Dim r As New System.Text.RegularExpressions.Regex( _ "<(dd\b[^>]*>(.*?)</\1>", _ System.Text.RegularExpressions.RegexOptions.IgnoreCase Or _ System.Text.RegularExpressions.RegexOptions.Singleline) 'HTML.DOCUMENT内で正規表現と一致する対象をすべて検索 Dim mc As System.Text.RegularExpressions.MatchCollection = _ r.Matches(HTML.DOCUMENT) For Each m As System.Text.RegularExpressions.Match In mc '正規表現に一致したグループの文字列を表示 Console.WriteLine("タグ:" + m.Groups(1).Value + vbCrLf + _ "タグ内の文字列:" + m.Groups(2).Value) Next
お礼
正規表現というキーワードはググっているうちに何度か目撃し、 この方法か、Webbrouserの解析結果を 取得するかと感じていました。しかし、ちょっと敷居が高いと感じていたもので。 参考にさせていただき、じっくり読み解いてみたいと思います。 ありがとうございました。
お礼
丁寧にありがとうございます。 今のところ、VBAをVB2010に変換するのもうまくできない 初心者なのですが、参考にさせていただき、がんばってみようと思います。 ありがとうございました。