アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

よろしくお願いします。

A 回答 (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
    • good
    • 0

>VB2010を使用し


 私は、VB は解りませんが、回答が付かないようですので、ご参考までにご覧ください。(私の場合は、WSH や VBA で、よく同様の作業をしております)。

#回答を書いている内に、回答が付いたようですが、せっかく書いたので、恥ずかしながら投稿いたします。
#全くの見当違いな回答でしたら、お見捨てください。

--------------------------------

>下記のように記述されたホームページの一部から

とのことですが、お示しの html コード だけでは、この中から、

>データを読み取りし

ご要望の text を取得しようとすると、その「ホームページ」の全ての html コード の中から「<dl class= ~~」などの位置を取得して、それ以降の文字列を「文字列操作関数」で切り分けていくような段取りになるかと存じます。

--------------------------------

 お示しの html コード が「name = "~~"」とか「id = "~~"」などを内包する タグ を親要素として持っている場合でしたら、
>「ホームページ」の全ての html コード
ではなくて、[GetElementByName メソッド] や [GetElementById メソッド] で、その innerHTML に内容を絞り込むことはできます。

--------------------------------

 あるいは、

http://blog.livedoor.jp/nipotan/archives/1542469 …

をご参考に、「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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/07 01:01

もし、必ず同じ場所にテキストが表示されるのなら、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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/07 00:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!