С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
1

Почему берется исключение при парсинге

06.09.2018, 08:57. Показов 1477. Ответов 6

Author24 — интернет-сервис помощи студентам
Столкнулся с такой проблемой, есть у меня код, в 13 студии он работает нормально, нет никаких эксепшенов. Этот же код в 17 студии выкидывает много исключений типа nullreferens. Не могу понять. что он от меня хочет,какую ссылку и на что. Исключение возникает тут в этой строке kartinka = item.SelectSingleNode ... Это же парсинг, а там может быть null, если он там тогда я делаю другую операцию.
Как правильно обработать на null, чтобы не было исключений, пробовал вроде но все равно сыпятся.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using HtmlAgilityPack;
    using System.Web;
    using ConsoleApp2;
 
    namespace probaparser
    {
        class Program
        {
            static void Main(string[] args)
            {
 
                Info i = new Info();
 
                string urrrla = "https://www.rabota66.ru/resume/rbranch1?page=0";
 
 
                Task.Factory.StartNew(() =>
                {
                    Console.WriteLine("поток до операции {0}", +Thread.CurrentThread.ManagedThreadId);
                    Disp(urrrla);
 
                });
 
                Console.WriteLine("------------------");
                Console.WriteLine("поток номер{0}", +Thread.CurrentThread.ManagedThreadId);
 
                Disp(urrrla);
 
                Console.WriteLine("поток до операции {0}", +Thread.CurrentThread.ManagedThreadId);
 
 
                Console.ReadKey();
 
            }
 
            public static async void Disp(string ue)
            {
 
                var f = await GetResumme(ue);
 
                foreach (var VARIABLE in f)
                {
                    Console.WriteLine(VARIABLE.Foto);
                }
 
                Console.WriteLine("{0}", Thread.CurrentThread.ManagedThreadId);
 
            }
 
 
            // Создаю метод ввиде задачи, которая будет выполняться асинхролнно.
            public static async Task<string> Getpage(string url)
            {
 
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.Referer = "http://google.com"; // Реферер. Тут можно указать любой URL
                using (var httpWebResponse = await httpWebRequest.GetResponseAsync() as HttpWebResponse)
                {
                    using (var stream = httpWebResponse.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet)))
                        {
                            // читаем ассинхронно построчно
                            return await reader.ReadToEndAsync();
                        }
                    }
                }
 
 
            }
            // метод который выполнятся должен асинхронно.
            // await поставил перд методом, тип которого задача,которая возвращает
 
            public static async Task<List<Info>> GetResumme(string ReadyString)
            {
 
                HtmlAgilityPack.HtmlDocument document = new HtmlDocument();
 
                document.LoadHtml(await Getpage(ReadyString));
 
                var list = new List<Info>();
 
                // получаем резюме
                var items = document.DocumentNode.SelectNodes("//ul[@class='visitor-resume-list']/li");
 
                foreach (var item in items)
                {
                    var name = item.SelectSingleNode(".//h2[@data-ga='resumeListItem']").InnerText;
                    var data = item.SelectSingleNode(".//div[@class='title-']/following-sibling::div")
                        .SelectNodes(".//p");
                    var salary = item.SelectSingleNode(".//b[@class='salary-']").InnerText;
                    var Prof_info = item.SelectNodes(".//dl[@class='prof-path-']/p");
 
                    string kartinka;
 
                    try
                    {
                        kartinka = item.SelectSingleNode(".//a[@class='vrloa-img img_zoom']").Attributes["href"].Value;
                    }
                    catch (Exception e)
                    {
                        kartinka = "Нет изображения";
                    }
 
                    string Data = string.Join("\n", data.Select(x => string.Format("  {0}", x.InnerText.Trim())));
 
                    if (Prof_info != null)
                    {
                        string prooof = string.Join("\n",
                        Prof_info.Select(x => string.Format("   >{0}", x.InnerText.Trim())));
 
                        list.Add(new Info()
                        {
                            VacansName = name,
                            Name = Data,
                            Salary = salary,
                            Expiriens = prooof,
                            Foto = kartinka
                        });
                    }
                }
 
                return list;
            }
        }
    }
 public  class Info
    {
 
        public string VacansName { get; set; }
        public string Name { get; set; }
 
        // public string PojelaniyKRabote { get; set; }
        public string Expiriens { get; set; }
        public string Salary { get; set; }
        public static string VakansyRubrick { get; set; }
        public string Foto { get; set; }
 
 
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2018, 08:57
Ответы с готовыми решениями:

Исключение при парсинге файлов
Есть программа using System; using System.Collections.Generic; using System.Linq; using...

Вообще не могу понять откуда берется исключение
Необработанное исключение типа &quot;System.IndexOutOfRangeException&quot; произошло в ConsoleProject.exe ...

Исключение при парсинге JArray
Здравствуйте! Имеется JSON строка следующего типа: { &quot;employees&quot;: } Пытаюсь ее парсить...

Почему-то возвращает исключение при сортировки пузырьком массива строк
Не понимаю в чем дело, просто переделал сортировку пузырьком под массив строк. Задание из Шилдта. ...

6
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
06.09.2018, 16:54 2
качать либу с HtmlAgilityPack мне влом, и ошибку студия кидает не NullReference, а "Оператор foreach не работает с переменными типа "?", так как "?" не содержит открытого определения для "GetEnumerator"." на 95ую строку.

если у возвращаемого параметра метода document.DocumentNode.SelectNodes() есть Enumerator, то просто задайте тип items явно, а не через var.

если у вас какие-то другие ошибки, хотя бы перечислите строки, на которых они вываливаются
0
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
06.09.2018, 17:14 3
Исключения есть, но они обработаны, программа не падает, что-то там пишет в консоль. Так что проблема не ясна.
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
06.09.2018, 17:16  [ТС] 4
ощибка 17 студия выводитв этом месте kartinka = item.SelectSingleNode(".//a[@class='vrloa-img img_zoom']").Attributes["href"].Value; программа выполняется дальше а в консоле ошибок идут исключения

Добавлено через 55 секунд
Мне бы как то их- убрать,чтобы не было их совсем,а так да программа не падает.
0
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
06.09.2018, 17:17 5
Лучший ответ Сообщение было отмечено Мдфв1234 как решение

Решение

Цитата Сообщение от Мдфв1234 Посмотреть сообщение
а в консоле ошибок идут исключения
Ну идут и что дальше? Значит нет такого нода, или у нода нету атрибута который вы хотите или что-то еще.

C#
1
2
3
4
5
6
7
8
                    try
                    {
                        kartinka = item.SelectSingleNode(".//a[@class='vrloa-img img_zoom']").Attributes["href"].Value;
                    }
                    catch (Exception e)
                    {
                        kartinka = "Нет изображения";
                    }
меняете на
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var node = item.SelectSingleNode(".//a[@class='vrloa-img img_zoom']");
 
if (node != null)
{
    var art = node.Attributes["href"];
    if (atr != null)
    {
         kartinka = atr.Value;
    }
    else
    {
         kartinka = "Нет изображения";
    }
}
или на
C#
1
kartinka = item.SelectSingleNode(".//a[@class='vrloa-img img_zoom']")?.Attributes["href"]?.Value ?? "Нет изображения";
1
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
06.09.2018, 17:20  [ТС] 6
Ну а если я страниц много собираюсь парсить то и исключений подобных будет много , если исключение есть это вроде неверно. Или я не прав.
0
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
06.09.2018, 17:22 7
Цитата Сообщение от Мдфв1234 Посмотреть сообщение
если исключение есть это вроде неверно. Или я не прав
Все зависит от конкретной ситуации.
0
06.09.2018, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2018, 17:22
Помогаю со студенческими работами здесь

Почему при взаимодействии с файлами из системной директории вылетает исключение?
Вот возникла крайне банальная проблема: При записи в файл который находится в директории...

Блокировка при парсинге
Доброго времени суток. Вопрос. Парсю сайт, но через некоторое время меня блокируют на нем....

Ошибка при парсинге IP
Какая-то странная ошибка возникает при парсинге строки Ip. Сама строка берётся из MaskedTextBox....

Кракозябры при парсинге страницы
Получаю код страницы. С помощью регулярок извлекаю значение тэга заголовка страницы(&lt;title&gt;). Но в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru