VB.NETで、ページのHTMLの指定の部分を簡単にコピーしようと思っています。

そこで、Button1のクリックイベントに以下のコードをいれてみました。

Dim all As HtmlElementCollection = WebBrowser1.Document.All
Dim forms As HtmlElementCollection = all.GetElementsByName("strong1")
Clipboard.SetText(forms(0).InnerText)

しかし、これではエラーが発生し、正常に取得できていない模様です。
コピーしたいのは、HTMLの以下の部分(例)で、

<span class="strong1">サンプル</span>

idの取得が出来ることは知っていたのですが、class内の文字列を取得することはできないのですか?
なにか別の対処法もしくは改善点があれば、ご教授願います。

ちなみに、<span class="strong1">の部分を毎回コピーする作業をしているので、これを簡単にしようと思っています。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/12/22 00:19:54
  • 終了:2011/12/26 16:40:19

ベストアンサー

id:TransFreeBSD No.1

TransFreeBSD回答回数667ベストアンサー獲得回数2682011/12/22 13:43:44

GetElementsByNameはidやname属性に対するものでclassはみません。
ぱっと見た感じ、.Netにはそういうメソッドない様なので、for eachで回しながらGetAttributeでclass属性を取得して比較し、一つ一つ探すことになりそうです。
ちなみに、自身のタグも含めHTMLとして取得する場合は、InnerTextではなくOuterHtmlになると思います。

他1件のコメントを見る
id:TransFreeBSD

CSSのセレクタでいう所の"span.strong1"相当だと以下です。

For Each es As HtmlElement In WebBrowser1.Document.GetElementsByTagName("span")
    If es.GetAttribute("className") = "strong1" Then
        Clipboard.SetText(es.OuterHtml)
        Exit For
    End If
Next

"span.strong1"ではなく".strong1"ならば「GetElementsByTagName("span")」を「All」に変えてください。
あと、欲しいのがタグ全体なのか、間の表示されているテキストなのかで、「OuterHtml」か「InnerText」かが決まります。

2011/12/23 13:49:09
id:hokuto0127

有難うございます!ちょっと一時期パソコンが出来ない環境でして、遅れてすみません。

2011/12/26 16:36:41

その他の回答(1件)

id:TransFreeBSD No.1

TransFreeBSD回答回数667ベストアンサー獲得回数2682011/12/22 13:43:44ここでベストアンサー

GetElementsByNameはidやname属性に対するものでclassはみません。
ぱっと見た感じ、.Netにはそういうメソッドない様なので、for eachで回しながらGetAttributeでclass属性を取得して比較し、一つ一つ探すことになりそうです。
ちなみに、自身のタグも含めHTMLとして取得する場合は、InnerTextではなくOuterHtmlになると思います。

他1件のコメントを見る
id:TransFreeBSD

CSSのセレクタでいう所の"span.strong1"相当だと以下です。

For Each es As HtmlElement In WebBrowser1.Document.GetElementsByTagName("span")
    If es.GetAttribute("className") = "strong1" Then
        Clipboard.SetText(es.OuterHtml)
        Exit For
    End If
Next

"span.strong1"ではなく".strong1"ならば「GetElementsByTagName("span")」を「All」に変えてください。
あと、欲しいのがタグ全体なのか、間の表示されているテキストなのかで、「OuterHtml」か「InnerText」かが決まります。

2011/12/23 13:49:09
id:hokuto0127

有難うございます!ちょっと一時期パソコンが出来ない環境でして、遅れてすみません。

2011/12/26 16:36:41
id:ken3memo No.2

ken3memo回答回数246ベストアンサー獲得回数772011/12/23 01:05:00

id:TransFreeBSD さん作成の回答No1.を参考に、
VBS ですが、
.getElementsByTagName("span")を使用してテストしてみました。
(VB.NETのテスト/ソースじゃなくてすみません)


    'IEのオブジェクトを作成する
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Top = 100
    objIE.Left = 100
    objIE.Width = 1024

    objIE.Visible = True

    'ページを開く(.Navigateで表示する。)
    objIE.Navigate "http://dec2011.top1-12.info/test1223.html"
    Wscript.Sleep 1000   '1000で1秒

    '読み込み完了となるまで、ループする。
    While objIE.ReadyState <> 4 Or objIE.Busy  'READYSTATE_COMPLETE = 4
        Wscript.Sleep 100   '0.1秒待つ、1000で1秒
    Wend
    Wscript.Sleep 1000   '1秒

    'spanのタグを集める .getElementsByTagName("span")を使用
    Set objspan = objIE.Document.getElementsByTagName("span")

    'ループで頭から表示
    strTEXT = ""   '空白で初期化
    For n = 0 To objspan.Length - 1
        '※ HTMLの外と中を探したいので、.OuterHTMLと.InnerTEXTを使用
        Msgbox objspan(n).OuterHTML
        'class="strong1"が↑class=strong1になっているのが気になるが
        If Instr(objspan(n).OuterHTML,"class=strong1") > 0 Then
            strTEXT = objspan(n).InnerTEXT  'ほしいのは中の文字なので.InnerTEXTをセット
            Exit For  '一番最初に見つけたデータのみ処理する
        End If
        '
    Next

    Msgbox "見つけたのは " & strTEXT & "です"

    '全て .OuterHTMLを使用して探してみた

'IEを閉じたり、後始末
    'objIE.Quit    'でパックなのでコメントアウト IEを閉じたり、後始末をする

'spanのタグを集める .getElementsByTagName("span")を使用
Set objspan = objIE.Document.getElementsByTagName("span")
でテストしてみました。

.getElementsByTagNameで"span"を指定して、
.OuterHTMLで確認後、.InnerTEXTで取得してみてください。

.netで処理する時の参考となれば幸いです。

VBSでテスト


VBS IE操作 テスト .getElementsByTagName("span")を使用 - YouTube
D
  • id:psne
    classの場合、HTML内に複数出てくる事も考えられるので、
    複数出てきた場合に、どの部分を抽出するかを判断する必要があるように思います。
    ※たとえば、カレンダーなど。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません