我编写一个简单的抓取工具的尝试似乎被我的目标网页(如在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只执行它们?
论坛上的第一个问题,期待更多(希望更聪明的)
答案 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。
我不确定这是否会帮助您隔离问题 - 对我而言确实如此。