2012-02-01 33 views
0

我在编写一个简单的爬虫程序时,似乎被我的目标网页(如在UI浏览器控件中或通过典型的浏览器应用程序)不能作为HTMLDocument完全访问(由于框架,javascript等)VB.NET Webbrowser.Document - 你看到的并不是你可以得到的

下面的代码执行,并且正确的网页(例如显示项目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只执行它们?

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

+0

你只是想提取链接?如果是这样,请尝试HTML敏捷包http://htmlagilitypack.codeplex.com – 2012-02-01 23:59:33

+0

谢谢,我正在研究HTML敏捷包,但我确实想使用WebBrowser,因为最终我会调用jscripts; GetElementById和GetAttribute的简单性也很吸引人。 – SteveValarenti 2012-02-02 16:35:33

回答

0

使用webbrowser1.Document或类似的东西时,被警告 - 你不会得到“原始的HTML”

例子:(假定wbMain在该示例web浏览器控件)

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

,如显示在RTB_RawHTML的主体标签部分在体内标记的代码将不完全中显示RTB_BodyHTML匹配的HTML。通过访问它(yourwebbrowserhere).Document.Body.OuterHtml似乎'清理'它有点,而不是'原始'的HTML作为retreived(yourwebbrowserhere).DocumentText

这是我的一个问题,当我做一个网站刮板,因为它会不断地把我扔掉 - 有时我会尝试匹配一个标签,它会发现它,而其他时候,即使我确信它在那里。原因是我试图匹配原始html,但我需要匹配'清理'html。

林不知道这是否会帮助你隔离问题 - 对我来说它确实。

相关问题