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文档加载之前访问对象 - WebBrowsers 是异步的。只需使用HTML Agility Pack之类的库来解析 HTML 。

以下是<meta>使用 HTML Agility Pack 获取标签的方法。(假设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

您可以直接从 WebBrowser 控件中检索 META 标记和任何其他 HTML 元素,无需 HTML Agility Pack 或其他组件。

就像 Mark 说的,首先等待 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 回答