2.WebBrowserを使ってのHTMファイル内の全ての要素を調査(08_Int_02) (旧、SampleNo.433/SampleNo.257) |
1.WebBrowserを使ってのHTMファイル内の全ての要素を調査 2.上記実行結果とコントロール類の配置図 3.参考資料 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 / Internet Explorer 11.0 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :追加なし 参照設定:追加なし 使用コン:Button1 〜 Button4 / WebBrowser1 / TextBox1 〜 TextBox3 / SplitContainer1 トロール: このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.WebBrowserを使ってのHTMファイル内の全ての要素を調査 |
Public Class Form1 #Region "本文関係の処理(Button_Click イベントの処理等)" Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '全ての要素を取得(その1) TextBox2.Text = "" TextBox2.Refresh() Dim myText As New System.Text.StringBuilder() Dim i As Integer = 0 Dim he As HtmlElement = Nothing myText.Append(fStrCut("No.", 8) & fStrCut("要素名", 15) & fStrCut("Type", 24) & _ fStrCut("ID", 36) & fStrCut("NAME", 27) & fStrCut("value", 33) & fStrCut("Text", 50) & _ ControlChars.CrLf & New System.String("-"c, 195) & vbCrLf) With WebBrowser1 For Each he In .Document.All If he.TagName = "IFRAME" Or he.TagName = "shape" Then '実行時エラーが発生するので無視する(上記以外にもあれば追加して下さい) Dim no1 As String = fStrCut(i.ToString, 8) Dim tn1 As String = fStrCut(he.TagName, 15) & _ "★★★★★ 必要な場合別途調査して下さい。★★★★★" myText.Append(no1 & tn1 & ControlChars.CrLf) i = i + 1 Else '取得したデータを表示する為に加工 Dim no As String = fStrCut(i.ToString, 8) Dim tn As String = fStrCut(he.TagName, 15) Dim ty As String = fStrCut(he.GetAttribute("Type"), 24) Dim id As String = fStrCut(he.GetAttribute("ID"), 36) Dim na As String = fStrCut(he.GetAttribute("NAME"), 24) & " " Dim va As String = fStrCut(he.GetAttribute("value"), 30) & " " Dim tx As String = fStrCut(Replace(he.InnerText, vbCrLf, ""), 50) If tn = "IMG " Then va = fStrCut(he.GetAttribute("alt"), 30) & " " tx = fStrCut(he.GetAttribute("src"), 50) End If If tn = "A " Then va = fStrCut(tx, 30) & " " tx = fStrCut(he.GetAttribute("href"), 50) End If myText.Append(no & tn & ty & id & na & va & tx & ControlChars.CrLf) i = i + 1 End If If (i Mod 30) = 0 Then myText.Append(New System.String("-"c, 195) & vbCrLf & fStrCut("No.", 8) & _ fStrCut("要素名", 15) & fStrCut("Type", 24) & fStrCut("ID", 36) & fStrCut("NAME", 27) & _ fStrCut("value", 33) & fStrCut("Text", 50) & vbCrLf & New System.String("-"c, 195) & vbCrLf) End If Next End With TextBox2.Text = myText.ToString() End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '全ての要素を取得(その2) TextBox2.Text = "" TextBox2.Refresh() Dim myText As New System.Text.StringBuilder() Dim i As Integer = 0 Dim he As HtmlElement = Nothing myText.Append(fStrCut("No.", 6) & fStrCut("F_No", 6) & " " & fStrCut("要素名", 15) & fStrCut("Type", 24) & _ fStrCut("ID", 36) & fStrCut("NAME", 27) & fStrCut("value", 33) & fStrCut("Text", 50) & _ ControlChars.CrLf & New System.String("-"c, 195) & vbCrLf) Debug.Print(WebBrowser1.Document.Forms.Count.ToString) With WebBrowser1 For k As Integer = 0 To .Document.Forms.Count - 1 For Each he In .Document.Forms(k).All If he.TagName = "IFRAME" Or he.TagName = "shape" Then '実行時エラーが発生するので無視する(上記以外にもあれば追加して下さい) Dim no1 As String = fStrCut(i.ToString, 8) Dim tn1 As String = fStrCut(he.TagName, 15) & fStrCut("F_No", 6) & _ "★★★★★ 必要な場合別途調査して下さい。★★★★★" myText.Append(no1 & tn1 & ControlChars.CrLf) i = i + 1 Else '取得したデータを表示する為に加工 Dim no As String = fStrCut(i.ToString, 8) Dim tn As String = fStrCut(he.TagName, 15) Dim ty As String = fStrCut(he.GetAttribute("Type"), 24) Dim id As String = fStrCut(he.GetAttribute("ID"), 36) Dim na As String = fStrCut(he.GetAttribute("NAME"), 24) & " " Dim va As String = fStrCut(he.GetAttribute("value"), 30) & " " Dim tx As String = fStrCut(Replace(he.InnerText, vbCrLf, ""), 50) If tn = "img " Then va = fStrCut(he.GetAttribute("alt"), 30) & " " tx = fStrCut(he.GetAttribute("src"), 50) End If If tn = "A " Then va = fStrCut(tx, 30) & " " tx = fStrCut(he.GetAttribute("href"), 50) End If myText.Append(no & fStrCut(k.ToString, 6) & tn & ty & id & na & va & tx & ControlChars.CrLf) i = i + 1 End If If (i Mod 30) = 0 Then myText.Append(New System.String("-"c, 195) & vbCrLf & fStrCut("No.", 6) & fStrCut("F_No", 6) & " " & _ fStrCut("要素名", 15) & fStrCut("Type", 24) & fStrCut("ID", 36) & fStrCut("NAME", 27) & _ fStrCut("value", 33) & fStrCut("Text", 50) & vbCrLf & New System.String("-"c, 195) & vbCrLf) End If Next Next End With TextBox2.Text = myText.ToString() End Sub Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click '指定の要素を取得 TextBox2.Text = "" TextBox2.Refresh() Dim myText As New System.Text.StringBuilder() Dim i As Integer = 0 Dim he As HtmlElement = Nothing myText.Append(fStrCut("No.", 8) & fStrCut("要素名", 15) & fStrCut("Type", 24) & _ fStrCut("ID", 36) & fStrCut("NAME", 27) & fStrCut("value", 33) & fStrCut("Text", 50) & _ ControlChars.CrLf & New System.String("-"c, 195) & vbCrLf) With WebBrowser1 For Each he In .Document.GetElementsByTagName(TextBox3.Text) If he.TagName = "IFRAME" Or he.TagName = "shape" Then '実行時エラーが発生するので無視する(上記以外にもあれば追加して下さい) Dim no1 As String = fStrCut(i.ToString, 8) Dim tn1 As String = fStrCut(he.TagName, 15) & _ "★★★★★ 必要な場合別途調査して下さい。★★★★★" myText.Append(no1 & tn1 & ControlChars.CrLf) i = i + 1 Else '取得したデータを表示する為に加工 Dim no As String = fStrCut(i.ToString, 8) Dim tn As String = fStrCut(he.TagName, 15) Dim ty As String = fStrCut(he.GetAttribute("Type"), 24) Dim id As String = fStrCut(he.GetAttribute("ID"), 36) Dim na As String = fStrCut(he.GetAttribute("NAME"), 24) & " " Dim va As String = fStrCut(he.GetAttribute("value"), 30) & " " Dim tx As String = fStrCut(Replace(he.InnerText, vbCrLf, ""), 50) If tn = "img " Then va = fStrCut(he.GetAttribute("alt"), 30) & " " tx = fStrCut(he.GetAttribute("src"), 50) End If If tn = "A " Then va = fStrCut(tx, 30) & " " tx = fStrCut(he.GetAttribute("href"), 50) End If myText.Append(no & tn & ty & id & na & va & tx & ControlChars.CrLf) i = i + 1 End If If (i Mod 30) = 0 Then myText.Append(New System.String("-"c, 195) & vbCrLf & fStrCut("No.", 8) & _ fStrCut("要素名", 15) & fStrCut("Type", 24) & fStrCut("ID", 36) & fStrCut("NAME", 27) & _ fStrCut("value", 33) & fStrCut("Text", 50) & vbCrLf & New System.String("-"c, 195) & vbCrLf) End If Next End With TextBox2.Text = myText.ToString() End Sub #End Region #Region "付帯処理関係(関数・メソッド及びWin32 API 関数の宣言及び変数の宣言等含む)" Private myUrl As Uri = New Uri("http://hanatyan.sakura.ne.jp/testfile1.htm") '表示するURL Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'サイトを表示 myUrl = New Uri(TextBox1.Text) WebBrowser1.Navigate(myUrl) Button2.Enabled = False Button3.Enabled = False Button4.Enabled = False Button5.Enabled = False With TextBox2 .Multiline = True .ScrollBars = ScrollBars.Both .WordWrap = False .Text = "" .Font = New Font("MS ゴシック", 9, FontStyle.Regular) End With End Sub Private Sub WebBrowser1_DocumentCompleted(sender As Object, _ e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted '指定の URL が表示されるまで待つ 'If e.Url <> myUrl Then ' Exit Sub 'End If Button2.Enabled = True Button3.Enabled = True Button4.Enabled = True Button5.Enabled = True End Sub Private Function fStrCut(ByVal Mystring As String, ByVal nLen As Integer) As String '文字列を指定のバイト数にカットする関数(漢字分断回避) If Mystring Is Nothing Then Mystring = "---- " End If If nLen < 1 Or Mystring.Length < 1 Then Mystring = "---- " End If Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS") Dim TempLen As Integer = sjis.GetByteCount(Mystring) If TempLen <= nLen Then '文字列が指定のバイト数未満の場合スペースを付加する Return Mystring.PadRight(nLen - (TempLen - Mystring.Length), " "c) End If Dim tempByt() As Byte = sjis.GetBytes(Mystring) Dim strTemp As String = sjis.GetString(tempByt, 0, nLen) '末尾が漢字分断されたら半角スペースと置き換え(VB2005="・" で.NET2003=NullChar になります) If strTemp.EndsWith(ControlChars.NullChar) Or strTemp.EndsWith("・") Then strTemp = sjis.GetString(tempByt, 0, nLen - 1) & " " End If Return strTemp End Function #End Region End Class |
2.上記実行結果とコントロール類の配置図 |
図1.全ての要素を取得(その1)の実行結果 図2.input 要素の取得結果 |
3.参考資料 |
HTMLの情報を取得する為の主なメソッド・プロパティ GetAttribute("alt") 代替テキストを取得する場合に使用 GetAttribute("checked") チェックボックスやラジオボタンの選択状況を取得 GetAttribute("href") リンク先のURL等を取得する場合 GetAttribute("id") 要素を識別するために固有の ID名を取得する場合 GetAttribute("name") 要素に付けられたname属性を取得する場合 GetAttribute("selected") オプションボタン等の選択状況を取得する場合 GetAttribute("selectedIndex") どのオプションボタン等が選択されているかを取得する場合 GetAttribute("src") 画像ファイル等の保存先の URI を取得する場合 GetAttribute("title") 要素内に記入されている title 属性を取得する場合 GetAttribute("type") 要素に付けられたtype属性を取得する場合 GetAttribute("value") その要素に記入されている値を取得する場合 GetElementById("ID名") 要素の ID 属性を検索キーとして使用して HtmlElement を取得する場合 GetElementsByName("属性名") 対応する名前を指定して要素のコレクションを取得 GetElementsByTagName("タグ名") 指定した HTML タグを持つ要素のコレクションを取得する場合 InnerHtml HTML マークアップを取得または設定する場合 InnerText テキストを取得または設定する場合 OuterHtml 現在の要素の HTML コードを取得または設定する場合 OuterText 現在の要素のテキストを取得または設定する場合 HTMLの情報を設定する為の主なメソッド・プロパティ InnerHtml HTML マークアップを取得または設定する場合 InnerText テキストを取得または設定する場合 InvokeMember("Click") ボタン・リンク等をクリックする場合 InvokeMember("focus") フォーカスを設定したい場合(画面の見える位置までスクロール) InvokeMember("onChange") Change イベントを発生させたい場合 InvokeMember("submit") 送信ボタンをクリックしてFORM action を実行させたい場合 InvokeScript("関数名") HTML ページで定義されたアクティブスクリプト関数を実行 OuterHtml 現在の要素の HTML コードを取得または設定する場合 OuterText 現在の要素のテキストを取得または設定する場合 RaiseEvent("onChange") Change イベントを発生させたい場合 SetAttribute("Checked", "") オプションボタン・チェックボックスの選択のチェックを外す場合 SetAttribute("Checked", "true") オプションボタン・チェックボックスを選択する場合 SetAttribute("Selected", "True") リストボックスのアイテムを選択する場合 SetAttribute("selectedIndex", "2") リストボックス等の指定のアイテムを選択する場合 SetAttribute("value", "文字列") テキストボックス等に書き込む場合 MSDN HtmlElement クラスの解説 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.aspx HTMLタグリファレンス(ABC順) http://www.htmq.com/html/index.shtml 要素・属性 辞典 http://w3g.jp/xhtml/dic/ |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |