HTML Agility Pack в "Необработанное исключение типа" System.ArgumentNullException "произошло в mscorlib.dll" Исключение

Я собираюсь разобрать контент сайта Контент сайта 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();
    }

Но добавьте исключение "Необработанное исключение типа" System.ArgumentNullException "произошло в mscorlib.dll".

Для получения дополнительной информации я загружаю свой проект здесь.

Скачать проект

1 ответ

Я создал образец из вашего кода и обнаружил следующее:

  1. Я не особенно знаком с xpath, но, похоже, чувствителен к регистру. Поиск "TD" ничего не даст, а поиск "td".

  2. SelectNodes будет возвращать ноль всякий раз, когда ничего не было найдено, и зависящий от него foreach всегда вызывает исключение. Так что лучше проверить, не является ли результат SelectNodes не нулевым, прежде чем пытаться зациклить его.


  foreach (HtmlNode td in row.SelectNodes("td"))
    {
        var ops = td.SelectNodes("option");

        if (ops != null)
        {
            foreach (HtmlNode option in ops)
            {
                options.Add(option.InnerText);
            }
        }
    }
Другие вопросы по тегам