1

我正在尝试解析页面加载完成后才填写的页面中的数据。因此,我无法获得一个简单的解决方案

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

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

我刚刚发现Waiting for WebBrowser ajax content答案是使用计时器....我不知道如何使用计时器而不是 Thread.Sleep() (它完全阻止线程)来解决这个问题,有人可以帮我吗通过快速示例代码了解使用它的正确方法?再次感谢

我正在研究自己调用 AJAX 的建议,但我认为使用计时器会更好。我仍在寻求有关该主题的帮助。谢谢。

4

2 回答 2

1

查看您正在处理的用于 Firefox 的 Firebug 的页面。有一个“Net”选项卡,它允许您查看在页面加载时(但在页面的初始部分已加载之后)发生的所有后续 HTTP Ajax 请求的实际原始数据。

通过查看这些数据,您很可能能够找到 JSON 或其他 XML 数据,其中包含您正在寻找的内容,以响应包含 ID 或类似性质的 GET 请求。

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

于 2012-05-29T05:53:10.333 回答
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 中提供了无效的 store #,它会转发到 404 类型的页面。第一个条件验证该元素仍然存在于页面上,如果它被发送到 404 页面则不会。第二个条件等到元素被填充。

如果在 AJAX 填充页面后,我发现了一件有趣的事情,wb.Document.InnerText 和 wb.DocumentStream 仍然包含下载的 html。仅更新 wb.Document.InterHTML。在我的情况下,我正在从结果中创建一个 HtmlAgilityPack HtmlDocument。因为 DocumentStream 变得过时了,我必须像这样重新创建我的文档:

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

在我的情况下,我不关心标题中的元/脚本,所以这是可行的。如果有人关心这些事情,他们显然需要修改那行代码以供自己使用。

于 2012-05-29T17:37:52.850 回答