【问题标题】:VB.NET Webbrowser.Document - what you see is not what you can getVB.NET Webbrowser.Document - 你看到的不是你能得到的
【发布时间】:2014-10-23 09:05:25
【问题描述】:

我编写简单爬虫的尝试似乎被以下事实所迷惑,因为我的目标网页(如 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

我已经搜索了足够多的东西来尝试使用 WebBrowser1.DocumentCompleted 之类的东西 事件,但这仍然不起作用。我试过插入睡眠命令。

我已经避免使用 WebClient 和正则表达式,我通常会这样做,因为我确信使用 DOM 会更容易处理我计划的其他事情,而且我知道 HTML敏捷包但没有足够的野心来学习它。因为似乎必须有一种简单的方法才能让这个该死的 webbrowser.document 对象与您实际看到的内容同步。

如果这是因为 javascript,有没有办法告诉网络浏览器只执行它们?

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

【问题讨论】:

  • 您是否只想提取链接?如果是这样,请尝试 HTML Agility Pack htmlagilitypack.codeplex.com
  • 谢谢,我正在研究 HTML Agility Pack,但我确实想使用 WebBrowser,因为最终我会想调用 jscripts; GetElementById 和 GetAttribute 的简单性也很吸引人。

标签: vb.net webbrowser-control dom


【解决方案1】:

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

示例:(假设 wbMain 是一个网络浏览器控件)

    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).DocumentText 检索到的“原始”html。

这对我来说是个问题在那里。原因是我试图匹配原始 html,但我需要匹配“清理”的 html。

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

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 2021-04-17
    • 2018-12-26
    • 2020-09-10
    • 1970-01-01
    • 2017-03-04
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多