• 締切済み

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 = 読み込み中   ← この値は変化しています よろしくお願いします。

みんなの回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

#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)
回答No.2

>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

199Xnen
質問者

お礼

丁寧にありがとうございます。 今のところ、VBAをVB2010に変換するのもうまくできない 初心者なのですが、参考にさせていただき、がんばってみようと思います。 ありがとうございました。

回答No.1

もし、必ず同じ場所にテキストが表示されるのなら、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

参考URL:
http://dobon.net/vb/dotnet/string/regexmatch.html
199Xnen
質問者

お礼

正規表現というキーワードはググっているうちに何度か目撃し、 この方法か、Webbrouserの解析結果を 取得するかと感じていました。しかし、ちょっと敷居が高いと感じていたもので。 参考にさせていただき、じっくり読み解いてみたいと思います。 ありがとうございました。

関連するQ&A