Парсер страницы

205
01 июня 2018, 19:00

когда пытаюсь вывести значения в CheckedListBox значения, на переменную node2 выскакивает ошибка System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта." Не могу понять как исправить.

   private void Form1_Load(object sender, EventArgs e)
    {
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        HtmlWeb hw = new HtmlWeb();
        doc = hw.Load("https://www.atsenergo.ru/nreport?rname=ivr_report_zone&rdate=20180401");
        HtmlNodeCollection nodes2 = doc.DocumentNode.SelectNodes("//*[@id=\"aid_files_list\"]/table/tbody/tr/td[2]/a");
        foreach (var item in nodes2)
            {
                table.Add(new ReportData() { url = item.Attributes["href"].Value, name = item.InnerHtml });
            }
        table.All(p => { checkedListBox1.Items.Add(p.name); return true; });
    }
Answer 1

SelectNodes не нашел ни одну node с вашим xpath'ом и вернул вам не пустой массив, а null. В описаниях метода написано это. Вам нужна проверка на null.

 HtmlNodeCollection nodes2 = doc.DocumentNode.SelectNodes("//*[@id=\"aid_files_list\"]/table/tbody/tr/td[2]/a");
if (nodes2 == null) return;
Answer 2

Вероятно метод load возвращает пустой документ. Скорее всего нужно дополнительная настройка для HtmlWeb, возможно куки.

HttpClient http = new HttpClient();
var response = await http.GetByteArrayAsync(website);
String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
Answer 3

Вам правильно говорят, что надо видеть какой исходный код страницы возвращается, потому что идти по DOM - это не всегда правильное решение. В одном случае оно работает, а в другом нет. Попробуйте такой xpath:

//a[contains(@title, 'Опубликовано')]

или можете так, если хотите сразу получить ссылку

//a[contains(@title, 'Опубликовано')]/@href
READ ALSO
Как вернуть строку черз маршалинг

Как вернуть строку черз маршалинг

Нужно вернуть строку с кода написанного на С++ в С#

192
Реализация корзины магазина в EntityFramework

Реализация корзины магазина в EntityFramework

База данных интернет магазинаЕсть два класса

186
Remove range в EF Core и транзакция

Remove range в EF Core и транзакция

Когда мы производим удаление с помощью Remove range в ef core у нас все выполняется в транзакции? Если, что то не удалится из списка удаляемых объектов...

190
Yii2 ActiveQuery сложный запрос

Yii2 ActiveQuery сложный запрос

Есть 2 таблицы: user и transactionСвязь один ко многим (1 пользователь – много транзакций)

300