none
vb.net 2010 获取网页元素的问题 RRS feed

  • 问题

  • Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Do
    Me.WebBrowser1.Navigate(" http://search.taobao.com/")
    System.Threading.Thread.Sleep(5000)

    Dim theElementCollection As HtmlElementCollection = Me.WebBrowser1.Document.GetElementsByTagName("a")
    '运行的时候这句会提示:未将对象引用设置到对象的实例。  而且还没打开这个页面!这是怎么回事呢?

    For Each curElement As HtmlElement In theElementCollection
    Dim controlName As String = curElement.GetAttribute("innertext").ToString
    If controlName = "站内信" Then
    MsgBox(controlName)
    Exit For
    End If
    Next
    Loop
    End Sub

    这段代码要是把打开网址放到窗体加载那里面去我在点这个按钮那样就不会有问题,关键是我想在这个按钮里面完成这段代码

    2012年1月7日 8:06

答案

  • 我是想一直让他循环找元素,还要找不同网页的元素,要是每进一个网页都要我去点那个按钮的话就是个半自动的了,我是想点了那个按钮就一直在我想找的那些网页里面去获取元素,这样就不用我一天都看到电脑了

    建议:

    1)你应该创建一个列表,通过固定格式固定下来。比如:

    网站地址+1个空格+要寻找的元素

    2)使用文本文件保存到exe同一个目录地下。

    3)在Form_Load时间中,请动态使用System.IO.ReadAllLines把全部的行读出来,存放到窗体类公共变量中(为String[])类型。同时声明一个WebBrowser类的实体,使用Do……While循环来做(示例代码如下,请自行根据实际情况改正):

    Public Class gb2

        Dim wb As New WebBrowser
        Dim strings() As String = Nothing
        '下标
        Dim index As Integer = 0
        Private Sub Form1_Load(sender As System.Objecte As System.EventArgsHandles MyBase.Load
            '加载全部内容
            strings = System.IO.File.ReadAllLines("C:\\try.txt")
            '声明一个新的WebBrowser实体类
            AddHandler wb.DocumentCompletedAddressOf SelfCompleted

            Do
                wb.Navigate(strings(index).Split(" ")(0))   '取出空格前面部分,也就是url地址
                While (wb.ReadyState <> WebBrowserReadyState.Complete)
                    Thread.Sleep(10)
                End While
    If (index>strings.Length)
    index = 0
    End If
            Loop
        End Sub

        Private Sub SelfCompleted(sender As Objecte As WebBrowserDocumentCompletedEventArgs)
            wb.Document.Window.Frames(0).Document.GetElementsByTagName(strings(index).Split(" ")(0))    '处理你找到的东西
        End Sub
    End Class

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


    2012年1月9日 5:29
    版主
  • 按你的需求,可以尝试用事件来实现,如下我给了一个列子,不过仅仅是一个例子供你参考:

    Public Class WebBrowserIsCompleted
        Private listUrl As New List(Of String)
        Private Event CurrentPageIsLoaded(index As Integer)
        Private Urlindex As Integer
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Urlindex = 0
            NavigateTheNextPage(Urlindex)
        End Sub
    
        Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
                Urlindex += 1
                RaiseEvent CurrentPageIsLoaded(Urlindex)
            End If
        End Sub
    
        Private Sub NavigateTheNextPage(index As Integer) Handles Me.CurrentPageIsLoaded
            'Your searching function
            SearchLinks()
            If Urlindex >= listUrl.Count Then
                MsgBox("searching is finished")
            Else
                Me.WebBrowser1.Navigate(listUrl.Item(index))
            End If
        End Sub
    
        Private Sub SearchLinks()
            Console.WriteLine(Me.WebBrowser1.Url)
        End Sub
    
        Private Sub WebBrowserIsCompleted_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            listUrl.AddRange({"www.microsoft.com", "www.google.com", "www.sohu.com"})
        End Sub
    End Class
    

    Best regards,


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2012年1月9日 5:33
    版主

全部回复

  • 您好

    您必須先確認網頁已經加載完成,否則會出問題,您可以

    1. 在 webBrowser 的 DocumentCompleted 事件中

    2. 在 Button Click 前,使用 webBrowser.ReadyState 做判斷

    參考

    如何判断WebBrowser浏览器网页加载完成

    http://www.cnblogs.com/csxiaobo/archive/2011/10/30/2229660.html


    歡迎參觀我的Blog.NET菜鳥自救會
    2012年1月7日 8:36
  • 你好楼主:

    1)此问题在我给出的链接中已经解决,正如小欧所言,因为你不知道何时整个网页加载完毕,所以应该用事件:http://social.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/45f3de23-a132-4e75-ae72-d04c554fd705

    2)你硬要等待,那么用死循环也可以诶:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ………………

        While(WebBrowser.ReadyState<>WebBrowserReadyState.Complete)

            Thread.Sleep(10);

       End While

       '做你的东西……

    End Sub


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月7日 9:00
    版主
  • 我是想一直让他循环找元素,还要找不同网页的元素,要是每进一个网页都要我去点那个按钮的话就是个半自动的了,我是想点了那个按钮就一直在我想找的那些网页里面去获取元素,这样就不用我一天都看到电脑了
    2012年1月7日 10:35
  • 我是想一直让他循环找元素,还要找不同网页的元素,要是每进一个网页都要我去点那个按钮的话就是个半自动的了,我是想点了那个按钮就一直在我想找的那些网页里面去获取元素,这样就不用我一天都看到电脑了

    建议:

    1)你应该创建一个列表,通过固定格式固定下来。比如:

    网站地址+1个空格+要寻找的元素

    2)使用文本文件保存到exe同一个目录地下。

    3)在Form_Load时间中,请动态使用System.IO.ReadAllLines把全部的行读出来,存放到窗体类公共变量中(为String[])类型。同时声明一个WebBrowser类的实体,使用Do……While循环来做(示例代码如下,请自行根据实际情况改正):

    Public Class gb2

        Dim wb As New WebBrowser
        Dim strings() As String = Nothing
        '下标
        Dim index As Integer = 0
        Private Sub Form1_Load(sender As System.Objecte As System.EventArgsHandles MyBase.Load
            '加载全部内容
            strings = System.IO.File.ReadAllLines("C:\\try.txt")
            '声明一个新的WebBrowser实体类
            AddHandler wb.DocumentCompletedAddressOf SelfCompleted

            Do
                wb.Navigate(strings(index).Split(" ")(0))   '取出空格前面部分,也就是url地址
                While (wb.ReadyState <> WebBrowserReadyState.Complete)
                    Thread.Sleep(10)
                End While
    If (index>strings.Length)
    index = 0
    End If
            Loop
        End Sub

        Private Sub SelfCompleted(sender As Objecte As WebBrowserDocumentCompletedEventArgs)
            wb.Document.Window.Frames(0).Document.GetElementsByTagName(strings(index).Split(" ")(0))    '处理你找到的东西
        End Sub
    End Class

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


    2012年1月9日 5:29
    版主
  • 按你的需求,可以尝试用事件来实现,如下我给了一个列子,不过仅仅是一个例子供你参考:

    Public Class WebBrowserIsCompleted
        Private listUrl As New List(Of String)
        Private Event CurrentPageIsLoaded(index As Integer)
        Private Urlindex As Integer
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Urlindex = 0
            NavigateTheNextPage(Urlindex)
        End Sub
    
        Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
            If Me.WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
                Urlindex += 1
                RaiseEvent CurrentPageIsLoaded(Urlindex)
            End If
        End Sub
    
        Private Sub NavigateTheNextPage(index As Integer) Handles Me.CurrentPageIsLoaded
            'Your searching function
            SearchLinks()
            If Urlindex >= listUrl.Count Then
                MsgBox("searching is finished")
            Else
                Me.WebBrowser1.Navigate(listUrl.Item(index))
            End If
        End Sub
    
        Private Sub SearchLinks()
            Console.WriteLine(Me.WebBrowser1.Url)
        End Sub
    
        Private Sub WebBrowserIsCompleted_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            listUrl.AddRange({"www.microsoft.com", "www.google.com", "www.sohu.com"})
        End Sub
    End Class
    

    Best regards,


    Mike Feng
    MSDN Community Support | Feedback to us
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2012年1月9日 5:33
    版主