【发布时间】: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