.net(c#)在迴圈語句中執行WebBrowser.Navigate();方法,每次迴圈等待網頁載入完後繼續執行的解決方案.

來源:互聯網
上載者:User

     最近在寫一個小程式的時候,遇到這樣的需求:

          已知一組網頁url地址,想擷取每一個網頁的html,實際上就是想利用迴圈語句裡面使用WebBrowser來載入每一個網頁,然後擷取他們的html,

          要實現這個功能,想想應該是件很簡單的事情,但是在實際操作中卻遇到了問題,因為迴圈語句和WebBrowser的載入不同步的原因,導致前一個

          前一個網頁還沒載入完,下一次迴圈又開始了....最終的結果是WebBrowser只擷取到了最後一個頁面的html.要解決這個問題,我們要做的就是

          讓迴圈執行完前一次後等待網頁載入完,然後執行下一次迴圈去載入下面的網頁.....,按照這個思路,寫了以下程式,經測試果然有效.

 

 

bool loading = true;   //該變數表示網頁是否正在載入.
        string html = string.Empty;
        WebBrowser browser = new WebBrowser();

        public void GetHtml(string[] urls)
        {            
            browser.Navigated += new WebBrowserNavigatedEventHandler(browser_Navigated);
            foreach (string url in urls)
            {
                loading = true;  //表示正在載入
                  browser.Navigate(url);

                while (loading)
                {
                    Application.DoEvents();//等待本次載入完畢才執行下次迴圈.
                }
            }
        }

        void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            html = browser.DocumentText;  //擷取到的html.

            loading = false;//在載入完成後,將該變數置為false,下一次迴圈隨即開始執行.
        }

 

 

        上面的問題解決了,下面隨之而來的問題是:  有時候載入一張頁面的時候,browser_Navigated會執行多次.

查了下網上的資料,原因是頁面中含有<iframe></iframe>,每一個<iframe>都會觸發一次browser_Navigated,

所以,以上程式可以完善如下:

 

 

bool loading = true;   //該變數表示網頁是否正在載入.
        string html = string.Empty;
        WebBrowser browser = new WebBrowser();

        public void GetHtml(string[] urls)
        {            
            browser.Navigated += new WebBrowserNavigatedEventHandler(browser_Navigated);
            foreach (string url in urls)
            {
                loading = true;  //表示正在載入
                browser.Navigate(url);

                while (loading)
                {
                    Application.DoEvents();//等待本次載入完畢才執行下次迴圈.
                }
            }
        }

        int i = 0;
        void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            i++;
            if (i % 3 == 0) // 假設每張頁面要執行3次browser_Navigated方法,那麼這表示網頁全部內容載入完成.(至於這個3要怎麼樣得到,那是仁者見仁的事情了,呵呵)
            {
                html = browser.DocumentText;  //擷取到的html.

                loading = false;//在載入完成後,將該變數置為false,下一次迴圈隨即開始執行.
            }
        }

 

 

以上只是筆者在工作中的一點小總結,寫出來做個筆記,也希望能給其他人帶來一些協助.相信解決此問題的方法頗多,望不吝賜教...

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.