• 締切済み

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

  • 特定部分のテキストを取得したい

    あるテンプレートに添って作られたページからテキストを取得するブックマークレットを作りたいのですが、 下記のような構造のページから りんご、みかん、ぶどう、部分のテキストだけ抜き出して取得するにはどうすればいいでしょうか? <h1 id="hoge">りんご</h1> ~ <span class="fuga"> <a href="test.html">みかん</a> </span> ~ <div class="piyo"> <dl class="foo"> <dt>xxx</dt><dd>ぶどう</dd> <dt>xxx</dt><dd>xxx</dd> <dt>xxx</dt><dd>xxx</dd> </dl> </div>

  • floatさせたdtの内容が多い場合、ddの背景と高さが合いません

    サイトの新着情報を<dl><dt><dd>で組んでいます。 罫線の上に左に画像、右に日付と新着内容が並んでいるように 見せたいのですが、<dt>を左にfloatし<dd>を回り込ませ、 <dd>に罫線の画像を背景で設定た場合、<dd>の内容が少ない時、 罫線画像が左の<dt>の画像と高さが合いません。 <dd>にClearfixを設定すると、モダンブラウザでは<dt>の高さと <dd>の罫線画像の高さが合い、希望通りの表示になりました。 しかし、IE6と7ではモダンブラウザと同じ表示にはなりません。 float以外の方法でも構いませんので、IE6以降とモダンブラウザ ともに<dl><dt><dd>で上記希望の表示を実現させる方法がありましたら、 アドバイス頂けないでしょうか、よろしくお願いしますm(__)m ソースは以下になります。 [HTML] <dl class="news"> <dt><img src="img/photo.jpg" width="50" height="50" /></dt> <dd><span>2009.01.01</span><br /> <a href="#">新着情報のテキストが入ります。</a></dd> <dt><img src="img/photo.jpg" width="50" height="50" /></dt> <dd><span>2009.01.01</span><br /> <a href="#">新着情報のテキストが入ります。</a></dd> <dt><img src="img/photo.jpg" width="50" height="50" /></dt> <dd><span>2009.01.01</span><br /> 新着情報のテキストが入ります。</dd> </dl> [CSS] #index dl.news { padding: 8px 15px; border: #999 1px solid; } #index dl.news dt { width: 50px; float: left; clear: left; } #index dl.news dd { margin: 0 0 6px; padding: 0 0 8px 57px; background: url(../img_cmn/linet.gif) repeat-x bottom; line-height: 125%; } #index dl.news dd:after {/* clearfix */ content: "."; display: block; visibility: hidden; height: 0.1px; font-size: 0.1em; line-height: 0; clear: both; }

    • ベストアンサー
    • HTML
  • 横並びしたいのですが

    横並びしたいのですがdd.sub内のテキストがwidthサイズを超えて2段になった場合や 改行(<br>)を入れた場合それ以降のclear: both;が効かない状態になってしまいます。 dl, dl dd { padding-left: 20px; padding-bottom: 15px; } dl dd.sub { float: left; clear: both; width: 55em; } dl dd.page { margin-left: 55em; margin-bottom: 10px; } <dl> <dt>1 あああ</dt> <dd class="sub">サブ1</dd> <dd class="page">p1</dd> <dt>2 いいい</dt> <dd class="sub">サブ2</dd> <dd class="page">p2</dd> <dt>3 ううう</dt> <dd class="sub">サブ3</dd> <dd class="page">p3</dd> </dl> 理想の並びとしては 1 あああ  サブ1 p1 2 いいい  サブ2 p2 3 ううう  サブ3 p3 のようにしたいのですがCSSをどのようにすれば可能でしょうか? 仮に<dd class="clear"></dd>を追加すれば回り込みの解除はできるのですが 無駄に要素を入れたくないもので他にいい方法はないものかと悩んでおります。

    • ベストアンサー
    • HTML
  • DD,DT,DDを横並び。paddingとmarginと無指定で

    DD,DT,DDを横並び。paddingとmarginと無指定で 下記の内どれが一番使われているのでしょうか? 理由も教えていただけれるとありがたいです。 dl,dt,dd{ margin:0; padding:0;} dt{ float:left; width:8em; } .list0 dd{ padding-left:7em;} .list2 dd{ margin-left:8em;} <div> <dl class="list0"> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> </dl> <br /> <dl class="list1"> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> </dl> <br /> <div class="list2"> <dl> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> </dl> <dl> <dt>短いタイトル</dt> <dd>短い説明、短い説明、短い説明</dd> </dl> </div> </div>

    • ベストアンサー
    • HTML
  • 複数のhtmlファイルをエクセルのセルに入れたい

    こちらの「http://q.hatena.ne.jp/1256199663」ような質問なのですが、 商品ページのUPをcsvファイルで一括アップロードしたいと考えています。 その際、たとえば001~010という品番の商品を登録するのであれば、それぞれの説明文などをHTMLで作成します。 (001.html,002.html~010.htmlという感じで10個のHTMLファイルを作成) その後一つ一つ開いてエクセルのセルを選択しコピペしていくのですが、この手間をうまく省けないかと思っております。 1つのエクセルファイル上で対象のセルに外部テキストファイルなどを一気に呼び込む方法などはあるのでしょうか? ちなみにRUBYの使い方は今勉強中です。 htmlはRUBYにより取得しました。 「http://okwave.jp/qa/q8084243.html」 htmlの内容はこちら↓ ======================== <dl id="ItemDetailDl" class="detailTable clearfix"> <dt id="ItemCodeDt" class="tLine">商品番号</dt> <dd id="ItemCodeDd" class="tLine">08-449-3680 (区分:2)</dd> <dt id="JanCodeDt" class="tLine">JANコード</dt> <dd id="JanCodeDd" class="tLine">4954753 032923</dd> <dt id="OriginCountryDt" class="tLine">原産国</dt> <dd id="OriginCountryDD" class="tLine">イタリア</dd> <dt id="ScientificNameDt" class="tLine">学名</dt> <dd id="ScientificNameDd" class="tLine">Citrus reticulata</dd> <dt id="ExtractionPartDt" class="tLine">抽出部位</dt> <dd id="ExtractionPartDd" class="tLine">果皮</dd> <dt id="ExtractionMethodDt" class="tLine">抽出方法</dt> <dd id="ExtractionMethodDd" class="tLine">圧搾法</dd> <dt id="UsePeriodDt" class="tLine">開封後の使用目安</dt> <dd id="UsePeriodDd" class="tLine">品質保持期限:商品に記載 開封後6ヶ月</dd> <dt id="SizeDt" class="tLine">サイズ</dt> <dd id="SizeDd" class="tLine">箱:30×30×65mm ボトル:φ22×55mm</dd> </dl> ========================

  • どなたか知恵を貸していただけないでしょうか。

    どなたか知恵を貸していただけないでしょうか。 定義タグを使って以下のような文書を作ってます。 (1)テキストテキストテキストテキストテキストテキストテキストテキストテキスト   テキストテキスト (2)テキストテキストテキストテキストテキストテキストテキストテキストテキスト   テキストテキスト (3)テキストテキストテキストテキストテキストテキストテキストテキストテキスト   てきすとてきすとてきすとてきすと   てきすとてきすとてきすと 1.<dl><dt> ~ </dt></dl>で囲みました。 テキストが長すぎて、改行した時に↓次の行の先頭文字が(1)と同じところまできてしまうので困っています。 (1)テキストテキストテキストテキストテキストテキストテキストテキストテキスト テキストテキスト (2)テキストテキストテキストテキストテキストテキストテキストテキストテキスト テキストテキスト (3)テキストテキストテキストテキストテキストテキストテキストテキストテキスト   てきすとてきすとてきすとてきす   てきすとてきすとてきすと もともとの<dt>タグは改行した時、インデントが次の行にも効かないものでしょうか。 以前は効いていたページもあったのですが、スタイルシートが変わって <dt>タグにいろいろ設定してしまったので、もともとの設定が効かなくなったのでしょうか。 2.<dt><dd>の横並びという方法も考えました。 XHTML <dl class="list309"> <dt>(1)</dt><dd>テキストテキスト......</dd> <dt>(2)</dt><dd>テキストテキスト......</dd> <dt>(3)</dt><dd>テキストテキスト......</dd> </dl> dl.list309 dt { clear: left; float: left; margin: 0 0 0 1em; width: 1em; padding-left: 0px; } dl.list309 dd { margin-bottom: 1em; margin-left: 0.5em; } ところが、(3)の本文中↓で<dd>を使いたいので困っています。 「  てきすとてきすとてきすとてきす    てきすとてきすとてきすと」 いったいどうすればよいでしょうか。

    • ベストアンサー
    • HTML
  • HTML dlについて

    HTML初心者です。 下記をdlタグで定義したいんですがどういう方法がいいんでしょうか? 入れ子にして作ったんですがどうも長ったらしいのでもっと完結にしたいんですが・・・・ うまく全部を関連付ける方法を教えて下さい。 <dl> <dt><ul> <li>1と2と3の題名</li></dt>   <dd> <li> <dl> <dt>題名1</dt></li>   <li><dd>内容1</dd></li>   <li><dt>題名2</dt></li>   <li><dd>内容2</dd></li>   <li><dt>題名3</dt></li>   <li><dd>内容3</dd></dl></li> </dl> </ul> </dd> </dl>

    • ベストアンサー
    • HTML
  • JQueryで$("dt span")クリック動作

    JQueryで$("dt span")をクリックしたときに 隣接するddタグの部分を表示させるには以下の記述を どのように修正すればよいのでしょうか? <html> <head> <style type="text/css"> dl { margin-bottom: 20px; } dd { display: none; } </style> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("dt span").click(function(){ $("+dd",this).slideToggle(); }); }); </script> </head> <body> <dl> <dt>toggle<span>開く</span></dt> <dd>テキストが入ります。</dd> </dl> <dl> <dt>toggle<span>開く</span></dt> <dd>テキストが入ります。</dd> </dl> </body> </html> ご存じの方がおられましたらご回答をよろしくお願いします。

  • VBAでIEに表示されている情報を取得したい。

    お世話になります。 VBAから起動したIEに記載されている情報をコピーしてエクセルに張りたいと 思っております。 下記で言いますと「08:04出発」という文字を取得したいのですが どのようにしたら取得できるのでしょうか? お手数ですがよろしくお願い致します。 ※当方、TextBoxに値を入れる・OKボタンを押す方法はわかったのですが、 表示されたページから値を取る方法がわからないのです。。。 <div class="infomation"> <dl><dt><span class="route-departure">08:04出発</span><span class="route-arrive-on">09:08到着</span>時間:</dt><dd>1時間4分(乗車53分、ほか11分)</dd></dl> <!--heikin-->

  • <dt>に隙間を入れる方法

    <DL class="goo"> <DT>あああ</DT> <DD>いいい</DD> <!-- この間 --> <DT>AAA</DT> <DD>BBB</DD> </DL> というHTMLを書きましたが、<DD>いいい</DD>と<DT>AAA</DT>の間を入れることがCSSでできません。どうしたら隙間をいれることができるのでしょいうか?

    • ベストアンサー
    • HTML

専門家に質問してみよう