0

私はこのコードを持っています:

string x = textBox1.Text;
string[] list = x.Split(';');
foreach (string u in list)
{
    string url = "http://*********/index.php?n=" + u;
    webBrowser1.Navigate(url);
    webBrowser1.Document.GetElementsByTagName("META");
}

<META>タグをメッセージボックスに出力しようとしていますが、テストすると、次のエラーが発生し続けます。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

4

3 に答える 3

3

問題はDocument、ドキュメントが読み込まれる前にオブジェクトにアクセスしていることです。これWebBrowserは非同期です。HTMLAgilityPackなどのライブラリを使用してHTMLを解析するだけです。

<meta>HTMLAgilityPackを使用してタグを取得する方法は次のとおりです。(と仮定using System.Net;using HtmlAgilityPack;ます。)

// Create a WebClient to use to download the string:
using(WebClient wc = new WebClient()) {
    // Create a document object
    HtmlDocument d = new HtmlDocument();

    // Download the content and parse the HTML:        
    d.LoadHtml(wc.DownloadString("http://stackoverflow.com/questions/10368605/getelementsbytagname-in-c-sharp/10368631#10368631"));

    // Loop through all the <meta> tags:
    foreach(HtmlNode metaTag in d.DocumentNode.Descendants("meta")) {
        // It's a <meta> tag! Do something with it.
    }
}
于 2012-04-29T00:07:50.613 に答える
2

読み込みが完了するまで、ドキュメントにアクセスしようとしないでください。イベントのハンドラー内でそのコードを実行しますDocumentCompleted

しかし、マティは正しいです。HTMLを読むだけでよい場合は、を使用しないでくださいWebBrowser。テキストをフェッチし、HTMLパーサーを使用して解析するだけです。

于 2012-04-29T00:06:08.273 に答える
0

METAタグやその他のHTML要素はWebBrowserコントロールから直接取得できます。HTMLAgilityPackやその他のコンポーネントは必要ありません。

マークが言ったように、最初にDocumentCompletedイベントを待ちます。

webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;

次に、HTMLドキュメントから任意の要素とコンテンツをキャッチできます。次のコードは、タイトルとメタディスクリプションを取得します。

private void WebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
        System.Windows.Forms.WebBrowser browser = sender as System.Windows.Forms.WebBrowser;
        string title = browser.Document.Title;
        string description = String.Empty;
        foreach (HtmlElement meta in browser.Document.GetElementsByTagName("META"))
        {
            if (meta.Name.ToLower() == "description")
            {
                description = meta.GetAttribute("content");
            }
        }
}
于 2013-06-05T16:41:35.617 に答える