2012-12-20 24 views
2
webBrowser1.Navigate(myurl); 
HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("HTML"); 
foreach (HtmlElement link in links) 
{ 
MessageBox.Show(link.InnerHtml);   
} 

我使用上面的代碼,可以獲取網頁的整個HTML文檔,但我真正想要的是獲取超鏈接url(url as(「a href」))在HTML文檔中。如何使用WebBrowser在JavaScript中編寫的網頁中獲取超鏈接

我用:

MessageBox.Show(link.GetAttribute("href")); 

但它返回null。

有人可以幫我解決問題不使用正則表達式但使用類似簡單函數的東西?

使用JavaScript的HTML代碼如下所示:

<HTML> 
<HEAD> 
<TITLE>Test for me</TITLE> 
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /> 
<SCRIPT LANGUAGE="JavaScript"> 
<!-- 


function window::onload() 
{ 

result.innerHTML = 
     "<br><center><font size=+1><a href='MyMain.aspx' target='_parent'>Back to My Main  Page</a></font><br>" 
    + "<font size=+2><b><a href='http://MySub.asp'>Launch My Application</a></b></font></center>";  
} 

--> 
</SCRIPT> 
</HEAD> 

<BODY> 
<div id="result" /> 
</BODY> 
</HTML> 
+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

窗口加載函數真的是'function window :: onload()'?這不是JavaScript ......我不知道那是什麼。 – JayC

回答

1

這幾乎是一個完整的猜測,但:

  • 你很可能將不得不等待,直到文件實際 在抓取您的內容之前加載
  • 你需要搶權 內容(「A」標記)

通過http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted.aspx去,我猜下面的代碼可能工作:

首先,建立一個事件處理程序:

// Add an event handler that processes the document after it loads. 
webBrowser1.DocumentCompleted += 
    new WebBrowserDocumentCompletedEventHandler(ProcessDocument); 

別處,定義處理器(以及需要採取什麼措施)

private void ProcessDocument(object sender, 
    WebBrowserDocumentCompletedEventArgs e) 
{ 

    var webBrowser1 = (WebBrowser)sender; 

    HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("A"); 
    foreach (HtmlElement link in links) 
    { 
     MessageBox.Show(link.GetAttribute("href"));   
    } 

} 

最後:

webBrowser1.Navigate(myurl); 

的問題是,在MSDN文檔沒有說太多,什麼都有發生前的文件是「完全加載」。

編輯:我終於在LinqPad上試過了,它看起來並不像它暴露與「窗口加載」事件有關的任何事情,至少直接。我打賭DocumentCompleted事件更像是一個「DOMReady」事件。以下是一些破解,但它出現在DocumentTitleChange事件的第三次調用中,它抓取了href的內容。請注意第三次調用它的原因是我有javascript改變標題

void Main() 
{ 
    WebBrowser webBrowser1 = new WebBrowser(); 
    webBrowser1.DocumentTitleChanged += 
     new EventHandler(ProcessDocument); 
    webBrowser1.Navigate("http://localhost/test/test.html"); 

    Console.ReadLine(); 
} 

// Define other methods and classes here 

private void ProcessDocument(object sender, 
    EventArgs e) 
{ 

    var webBrowser1 = (WebBrowser)sender; 
    Console.WriteLine("ProcessDocument BEGIN"); 
    HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("A"); 
    foreach (HtmlElement link in links) 
    { 
     Console.WriteLine(link.GetAttribute("href"));   
    } 
    Console.WriteLine("ProcessDocument END"); 
    Console.Out.Flush(); 

} 

是HTML是:

<HTML> 
<HEAD> 
<TITLE>Test for me</TITLE> 
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /> 
<SCRIPT LANGUAGE="JavaScript"> 
<!-- 


function foo() 
{ 
    var result = document.getElementById('result'); 
result.innerHTML = 
     "<br><center><font size=+1><a href='MyMain.aspx' target='_parent'>Back to My Main  Page</a></font><br>" 
    + "<font size=+2><b><a href='http://MySub.asp'>Launch My Application</a></b></font></center>"; 
    document.title += "Hack..Aacklgahala, ribbit";  
} 

--> 
</SCRIPT> 
</HEAD> 

<BODY onload="foo()"> 
<a href="http://google.com">bar</a> 
<div id="result" /> 
</BODY> 
</HTML> 
+0

非常感謝你,JayC。我會嘗試你的方法。 :) – Yingxue

相關問題