HTML Agility pack抛出“mscorlib.dll中出现未处理的类型'System.ArgumentNullException'异常”异常

时间:2016-06-06 17:17:50

标签: html-agility-pack

我要解析网站内容网站HTML内容。我使用以下代码:

        private async void loadButton_Click(object sender, RoutedEventArgs e)
    {
        string address = "http://www.iiees.ac.ir/fa/eqcatalog";
        loadButton.IsEnabled = false;

        //string htmlCode = await DownloadStringAsync(address, Encoding.UTF8);
        string htmlCode = await GetDataAsync(address, Encoding.UTF8);
        paragraph1.Inlines.Add(new Run(htmlCode));
        loadButton.IsEnabled = true;
    }


    private async Task<string> GetDataAsync(string address, Encoding encoding)
    {
        string htmlCode = await DownloadStringAsync(address, encoding);
        List<string> options = new List<string>();
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(htmlCode);
        foreach (var table in doc.DocumentNode.SelectNodes("//table"))
        {
            if (table.Id == "CatalogForm")
            {
                foreach (HtmlNode row in table.SelectNodes("tr"))
                {
                    if (row.Attributes.Any(a => a.Value == "hidecircle"))
                    {
                        foreach (HtmlNode td in row.SelectNodes("TD"))
                        {
                            foreach (HtmlNode option in td.SelectNodes("option"))
                            {
                                options.Add(option.InnerText);
                            }
                        }
                    }
                }
            }
        }

        var sb = new StringBuilder();
        options.ForEach(str => sb.AppendLine(str));
        return sb.ToString();
    }

但是抛出“mscorlib.dll中发生了'System.ArgumentNullException'类型的未处理异常”异常。

有关详情,请上传我的项目here

Download project

1 个答案:

答案 0 :(得分:0)

我从您的代码中创建了一个示例,我发现了以下内容:

  1. 我对xpath并不是特别熟悉,但似乎区分大小写。正在寻找&#34; TD&#34;在搜索&#34; td&#34;将

  2. 只要找不到任何内容,SelectNodes将返回null,并且依赖于它的foreach将始终抛出异常。因此,最好在尝试循环之前检查SelectNodes的结果是否为空。

  3.   foreach (HtmlNode td in row.SelectNodes("td"))
        {
            var ops = td.SelectNodes("option");
    
            if (ops != null)
            {
                foreach (HtmlNode option in ops)
                {
                    options.Add(option.InnerText);
                }
            }
        }