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 ответ
Я создал образец из вашего кода и обнаружил следующее:
Я не особенно знаком с
xpath
, но, похоже, чувствителен к регистру. Поиск "TD" ничего не даст, а поиск "td".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);
}
}
}