2012-05-28 73 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請求尋找什麼。

使用鏈接帖子中提到的'假'瀏覽器應該被認爲是最後的手段,因爲它會產生最差的性能,因爲您可能會下載和解析更多的數據。