none
如何获取 WebBrowser.Document 中某命名空间中的元素? RRS feed

  • 问题

  • 如下文档,如何获取选中元素下的所有元素?

    我用如下代码无法获取选中部分元素下的元素,而其它部分却获取正常,是不是与它的命名空间有关?该如何写呢?

            For Each PageElement As HtmlElement In Me.WebBrowser1.Document.All
                Console.WriteLine(PageElement.TagName & PageElement.Id & PageElement.Name)
            Next


    韩立学


    2012年10月8日 8:07

答案

  • 恐怕你先要获取frame(假设你给出的是第一个frame):

     webBrowser1.Document.Window.Frames("frm_xxx").Document.Forms(0).InnerHtml

    如果Forms(0)找不到,请用GetElementById定位Form,然后尝试使用InnerHtml.


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 大海怪 2012年10月9日 8:59
    2012年10月9日 8:44
    版主
  •    Function FindHtmlElement(ByVal FindText As String, ByVal doc As HtmlDocument, ByVal cTagName As String, ByVal cGetAttribute As String, Optional ByVal StrictMatching As Boolean = False) As HtmlElement
            'cTagName:检索具有指定 html 标记的元素
            'cGetAttribute :比较的属性类型,取值为:Id、InnerText、Name、title、classname、value、等
            'doc:Webbrowser1.Document
            'StrictMatching:True严格匹配FindText
    
            Dim i, k As Integer
            FindHtmlElement = Nothing
    
            For i = 0 To doc.GetElementsByTagName(cTagName).Count - 1          '
                    If InStr(doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                        FindHtmlElement = doc.GetElementsByTagName(cTagName).Item(i)
                        Exit Function
                    End If
            Next
    
            For k = 0 To doc.Window.Frames.Count - 1
                For i = 0 To doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Count - 1
                        If InStr(doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                            FindHtmlElement = doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i)
                            Exit Function
                        End If
                Next
                '递归调用
                If FindHtmlElement Is Nothing Then
                    FindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching)
                End If
            Next
        End Function
    因为Id、及InnerText均可通过GetAttribute获取,所以代码简化如上:
    2013年5月28日 0:17

全部回复

  • 你看到他的上层是iframe,应该找对应ifame的document

    http://feiyun0112.cnblogs.com/

    2012年10月9日 2:21
    版主
  • 谢谢回复!

    但以下两段代码的执行结果是一样的,同样获取不到想要元素。

            For Each he As HtmlElement In Me.WebBrowser1.Document.All
                Console.WriteLine(he.TagName)
            Next
      
            For Each he As HtmlElement In Me.WebBrowser1.Document.GetElementById("frm_main").Document.All
                Console.WriteLine(he.TagName)
            Next
        End Sub


    韩立学

    2012年10月9日 5:53
  • 你确信Me.WebBrowser1.Document.GetElementById("frm_main").Document.All取得到值吗

    先看Me.WebBrowser1.Document.GetElementById("frm_main").Document.Body.Innerhtml


    http://feiyun0112.cnblogs.com/

    2012年10月9日 6:50
    版主
  • 谢谢回复!

    问题正在于此,Me.WebBrowser1.Document.GetElementById("frm_main").Document.Body.Innerhtml中并没有我想要的内容。

    我想要表单部分(下图标记)的元素,能直接告诉我如何写代码吗?


    韩立学

    2012年10月9日 7:12
  • 恐怕你先要获取frame(假设你给出的是第一个frame):

     webBrowser1.Document.Window.Frames("frm_xxx").Document.Forms(0).InnerHtml

    如果Forms(0)找不到,请用GetElementById定位Form,然后尝试使用InnerHtml.


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 大海怪 2012年10月9日 8:59
    2012年10月9日 8:44
    版主
  • 
    
    谢谢,遇到同样的问题,在这里找到了答案。
    
    
    2013年5月23日 0:08
  • 
    
    谢谢,遇到同样的问题,在这里找到了答案。
    
    

    以后遇到相同的问题需要关注,你可以点击某个帖子的左上角“订阅”,请注意你必须有订阅的邮箱,这样你不必回帖就可以看到讨论全部的情况啦!(订阅邮件可以在登陆MSDN之后右边“我的设置”中设置)。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年5月23日 9:00
    版主
  • 谢谢ProgrammingVolunteer,这个问题主要不知道该如何提出问题,所以很难找到相关的帖子进行关注,我在CSDN上搜索过,有说这是跨域访问,说比较难,我是最近才进来这里,我见这里的回复还比较快,所以将我的问题发帖提问的同时,搜索见到了这个帖子,跟我要提的问题一模一样,本想像在别的论坛一样收藏这个帖子,可没发现论坛有这功能,便回复了一个作为标记,同时将我提问帖删除了以免浪费资源及各位热心大大的精力。

    我知道订阅功能,只是我看到这帖子时,答案也已经有了,所以便没有使用订阅。

    我参照你的代码,写了个递归函数,比较方便找到要找的网页元素,明天将代码贴出来给大家一个参考。

    这个问题我已经找了很久,在这里才找到答案,再次谢谢你,ProgrammingVolunteer。

    2013年5月26日 13:03
  • 其实当你点击“订阅”,就可以在“我的警报”中查看到(如果你登陆之后,在右边菜单中可以点击“我的警报”)。

    如果方便的话,你还可以回复(譬如粘贴你的解决方案),谢谢哦!


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats


    Found any spamming-senders? Please report at: Spam Report

    2013年5月27日 1:24
    版主
  •    Function FindHtmlElement(ByVal FindText As String, ByVal doc As HtmlDocument, ByVal cTagName As String, ByVal cGetAttribute As String, Optional ByVal StrictMatching As Boolean = False) As HtmlElement
            'cTagName:检索具有指定 html 标记的元素
            'cGetAttribute :比较的属性类型,取值为:InnerText、Name、title、classname、value、等
            'doc:Webbrowser1.Document
            'StrictMatching:True严格匹配FindText
    
            Dim i, k As Integer
            FindHtmlElement = Nothing
    
            loopcount = loopcount + 1
            For i = 0 To doc.GetElementsByTagName(cTagName).Count - 1          '
                If cGetAttribute = "InnerText" Then
                    If InStr(doc.GetElementsByTagName(cTagName).Item(i).InnerText, FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.GetElementsByTagName(cTagName).Item(i).InnerText) > 0) Then
                        FindHtmlElement = doc.GetElementsByTagName(cTagName).Item(i)
                        Exit Function
                    End If
                Else
                    If InStr(doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                        FindHtmlElement = doc.GetElementsByTagName(cTagName).Item(i)
                        Exit Function
                    End If
                End If
            Next
    
            For k = 0 To doc.Window.Frames.Count - 1
                For i = 0 To doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Count - 1
                    If cGetAttribute = "InnerText" Then
                        If InStr(doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).InnerText, FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).InnerText) > 0) Then
                            FindHtmlElement = doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i)
                            Exit Function
                        End If
                    Else
                        If InStr(doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                            FindHtmlElement = doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i)
                            Exit Function
                        End If
                    End If
                Next
                '递归调用
                If FindHtmlElement Is Nothing Then
                    FindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching)
                End If
            Next
        End Function

    我写的查找网页元素的代码,以webbrowser1.Document作顶层。

    少了按ID查找。

    2013年5月27日 8:56
  •    Function FindHtmlElement(ByVal FindText As String, ByVal doc As HtmlDocument, ByVal cTagName As String, ByVal cGetAttribute As String, Optional ByVal StrictMatching As Boolean = False) As HtmlElement
            'cTagName:检索具有指定 html 标记的元素
            'cGetAttribute :比较的属性类型,取值为:Id、InnerText、Name、title、classname、value、等
            'doc:Webbrowser1.Document
            'StrictMatching:True严格匹配FindText
    
            Dim i, k As Integer
            FindHtmlElement = Nothing
    
            For i = 0 To doc.GetElementsByTagName(cTagName).Count - 1          '
                    If InStr(doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                        FindHtmlElement = doc.GetElementsByTagName(cTagName).Item(i)
                        Exit Function
                    End If
            Next
    
            For k = 0 To doc.Window.Frames.Count - 1
                For i = 0 To doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Count - 1
                        If InStr(doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute), FindText) > 0 And (Not StrictMatching Or InStr(FindText, doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i).GetAttribute(cGetAttribute)) > 0) Then
                            FindHtmlElement = doc.Window.Frames.Item(k).Document.GetElementsByTagName(cTagName).Item(i)
                            Exit Function
                        End If
                Next
                '递归调用
                If FindHtmlElement Is Nothing Then
                    FindHtmlElement = FindHtmlElement(FindText, doc.Window.Frames.Item(k).Document, cTagName, cGetAttribute, StrictMatching)
                End If
            Next
        End Function
    因为Id、及InnerText均可通过GetAttribute获取,所以代码简化如上:
    2013年5月28日 0:17