VB.NET Webbrowser.Document - 你看到的不是你能得到的

时间:2012-02-01 21:29:01

标签: vb.net webbrowser-control dom

我编写一个简单的抓取工具的尝试似乎被我的目标网页(如在UI浏览器控件中显示,或通过典型的浏览器应用程序)无法作为HTMLDocument完全访问这一事实所困扰(由于框架, javascript等。)

下面的代码执行,并且甚至可以在控件中看到正确的网页(例如显示项目50-59的网页),但是我希望检索到的“下一页”超链接是“...& start = 60“,我看到别的东西 - 对应于打开第一个目录页面的那个”......& start = 10“。 奇怪的是,如果我第二次按下按钮,我会得到我正在寻找的东西。对我来说更奇怪,如果我插入了一个MsgBox,就说我在循环等到WebBrowserReadyState.Complete之后,然后我得到了我正在寻找的东西。

Private Sub ButtonGo_Click(sender As System.Object, e As System.EventArgs) Handles ButtonGo.Click
    'start at this URL
    'e.g. http://www.somewebsite.com/properties?l=Dallas+TX&co=US&start=50
    catalogPageURL = TextBoxInitialURL.Text
    WebBrowser1.Navigate(catalogPageURL)
    While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
        Application.DoEvents()
    End While
    'Locate the URL associated with the NEXT>> hyperlink
    Dim allLinksInDocument As HtmlElementCollection = WebBrowser1.Document.GetElementsByTagName("a")
    Dim strNextPgLink As String = ""
    For Each link As HtmlElement In allLinksInDocument
        If link.GetAttribute("className") = "next" Then
            strNextPgLink = link.GetAttribute("href")
        End If
    Next
End Sub

我已经google了足够的尝试,比如使用WebBrowser1.DocumentCompleted 事件,但仍然没有奏效。我试过插入睡眠命令。

我已经避免使用WebClient和正则表达式,就像我通常会这样做的那样,因为我确信使用DOM对于我计划的其他事情会更容易,而且我知道HTML敏捷包但没有足够的雄心来学习它。因为似乎必须有一种简单的方法让这个dang webbrowser.document对象与你实际可以看到的东西同步。

如果这是因为javascript,有没有办法告诉webbrowser只执行它们?

论坛上的第一个问题,期待更多(希望更聪明的)

1 个答案:

答案 0 :(得分:0)

使用webbrowser1.Document或类似的东西时会收到警告 - 你不会得到'raw html'

示例:(假设wbMain是一个webbrowser控件)

    RTB_RawHTML.Text = wbMain.DocumentText
    Try
         RTB_BodyHTML.Text = wbMain.Document.Body.OuterHtml
    Catch
         debugMessage("Body tag not found.")
    End Try

在此示例中,RTB_RawHTML的body标记部分中显示的body标记中的代码与RTB_BodyHTML中显示的html不完全匹配。通过(yourwebbrowserhere)访问它.Document.Body.OuterHtml似乎有点“清理”它,而不是像(yourwebbrowserhere)检索到的'raw'html .DocumentText

当我制作网络刮刀时,这对我来说是一个问题,因为它会不断地让我失望 - 有时候我会尝试匹配标签而它会找到它,有时候即使我确定它也不会在那里。原因是我试图匹配原始html,但我需要匹配'已清理'的HTML。

我不确定这是否会帮助您隔离问题 - 对我而言确实如此。