2012-05-28 50 views
0

我想解析页面中没有填充的数据,直到页面加载完成。正因为如此,我不能得到一个简单的解决方案利用解析AJAX驱动页面

while (wb.ReadyState != WebBrowserReadyState.Complete) 
{ 
    Application.DoEvents(); 
} 

工作。我曾尝试使用在View Generated Source (After AJAX/JavaScript) in C#找到的解决方案,但我无法弄清楚如何让它等待下载后的加载数据。请帮忙!数据在加载后自动填充到页面中,不需要用户交互。谢谢!

我刚刚发现Waiting for WebBrowser ajax content如果答案是使用一个计时器....我不知道如何使用定时器,而不是Thread.sleep()方法(该块线程完全),有人可以帮我解决这个问题理解使用快速示例代码的正确方法?再次感谢

我正在调查自己调用AJAX的建议,但我认为它会更好地使用计时器。我仍然在寻找关于这个问题的帮助。谢谢。

+0

如果网站所有者希望他们的数据被别人使用的 - 他们会为 – zerkms

+0

它抓住小时商店位置...提供方便的API不完全是绝密的,这也不是他们提供了一个API要么......谢谢。 – Brandon

+1

然后只是执行相同的Ajax请求,没有抓住整个页面 – zerkms

回答

1

我的情况下面解决它:

while (wb.ReadyState != WebBrowserReadyState.Complete) 
    Application.DoEvents(); 

while (wb.Document.GetElementById(elementId) != null && wb.Document.GetElementById(elementId).InnerHtml == null) 
    Application.DoEvents(); 

第二while循环等待,直到指定的元素是由AJAX填充。在我的情况下,如果在URL中提供了无效的商店#,它将转发到404类型的页面。第一个条件验证该元素仍然存在于页面上,如果它被发送到404页面则不会发生。第二个条件等待,直到元素被填充。

我发现,如果该AJAX填充页面后,一个有趣的事情,wb.Document.InnerText和wb.DocumentStream仍然包含下载的HTML。只有wb.Document.InnHTML被更新。在我的情况下,我从结果创建一个HtmlAgilityPack HtmlDocument。由于DocumentStream变得过时了,我不得不重新创建我的文档这样的:

htmlDoc.LoadHtml("<html><head><title>" + wb.DocumentTitle + "</title></head><body>" + wb.Document.Body.InnerHtml + "</body></html>"); 

在我的情况我不关心在头元/脚本,所以此工程。如果有人关心这些事情,他们显然需要修改这一行代码以供自己使用。

0

看看你正在处理Firebug for Firefox的页面。有一个“网络”选项卡,可以让你查看页面加载时(但在页面的最初部分加载后)发生的所有后续HTTP Ajax请求的实际原始数据。

通过观察该数据,很可能你将能够找到JSON或其他XML数据包含要以响应包含的ID或类似这种事情的GET请求寻找什么。

使用链接帖子中提到的'假'浏览器应该被认为是最后的手段,因为它会产生最差的性能,因为您可能会下载和解析更多的数据。