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

上記のコードを使用して、Web ページの HTML ドキュメント全体を取得できますが、本当に必要なのは、HTML ドキュメント内のハイパーリンク URL (("a href") としての URL) を取得することです。

私が使う:

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>
4

1 に答える 1

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 イベントの 3 回目の呼び出しで表示され、href の内容を取得します。3 回目に呼び出される理由は、タイトルを変更する 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>
于 2012-12-20T06:19:43.923 に答える