已知一組網頁url地址,想獲取每一個網頁的html,實際上就是想利用循環語句裏面使用WebBrowser來加載每一個網頁,然後獲取他們的html,
要實現這個功能,想想應該是件很簡單的事情,但是在實際操作中卻遇到了問題,因爲循環語句和WebBrowser的加載不同步的原因,導致前一個
前一個網頁還沒加載完,下一次循環又開始了....最終的結果是WebBrowser只獲取到了最後一個頁面的html.要解決這個問題,我們要做的就是
讓循環執行完前一次後等待網頁加載完,然後執行下一次循環去加載下面的網頁.....,按照這個思路,寫了以下程序,經測試果然有效.
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,
所以,以上程序可以完善如下:
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,下一次循環隨即開始執行.
}
}
以上只是筆者在工作中的一點小總結,寫出來做個筆記,也希望能給其他人帶來一些幫助.相信解決此問題的方法頗多,望不吝賜教...
C# webBrowser強制在本窗口打開,禁止在新窗口打開
有時需要用WebBrowser加載URL,來實現某些功能。而這時,我們就不希望所打開的頁面中的鏈接,在新窗口中打開,因爲這樣的話,實際上是用系統默認的瀏覽器打開了,從而脫離了你的WebBrowser,也就不能被你所控制了。
要解決這個問題,可以使用下面的方法:
假設WebBrowser的Name是 webBrowser
簡單方法-利用加載完成事件將所有的鏈接和form的target值改爲"_seft":
private
void webBrowser_DocumentCompleted(
object sender, WebBrowserDocumentCompletedEventArgs e) |
{ |
//將所有的鏈接的目標,指向本窗體 |
foreach (HtmlElement archor in
this .webBrowser.Document.Links) |
{ |
archor.SetAttribute( "target"
, "_self" ); |
} |
//將所有的FORM的提交目標,指向本窗體 |
foreach (HtmlElement form in
this .webBrowser.Document.Forms) |
{ |
form.SetAttribute( "target"
, "_self" ); |
} |
} |
取消新窗口事件
private
void webBrowser1_NewWindow(
object sender, CancelEventArgs e) |
{ |
e.Cancel = true
; |
} |
將 WebBrowser 的 AllowWebBrowserDrop 設爲 false(禁止拖放)
將 WebBrowser 的 WebBrowserShortcutsEnabled 設爲 false(禁止使用快捷鍵)
將 WebBrowser 的 IsWebBrowserContextMenuEnabled 設爲 false (禁止右鍵上下文菜單)