Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/88: Рейтинг темы: голосов - 88, средняя оценка - 4.94
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
1
.NET 4.x

Парсер сайта погоды Gismeteo.ru

04.06.2018, 20:39. Показов 17478. Ответов 12

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Столкнулся с проблемой и честно говоря не могу понять в чём причина. Стоит задача вытянуть с главной страницы сайта Gismeteo.ru погоду на завтра для популярных городов. Начал делать с использованием библиотеки Anglesharp но столкнулся с следующей проблемой если запрос идёт без условий всё ок, если ставишь условия, то результат null. Нагуглил уже миллион запросов начиная от LINQ заканчивая DOM и всё равно не вижу в чём проблема.
Код имеет следующий вид
C#
1
2
3
            var parser = new HtmlParser();
            var document = parser.Parse(source);
            var result = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("a0a35007699 e64913e36c4 c678c15222a aa762d35258 ");
Интересующий фрагмент на гисметео имеет вид
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="f6ff4330926">
                    <a href="https://www.gismeteo.ru/weather-barnaul-4720/" class="a0a35007699 e64913e36c4 c678c15222a aa762d35258 ">
                        <span class="a8315a764b4">Барнаул</span>
                    </a>
                </div>
            
                <div class="f6ff4330926">
                    <a href="https://www.gismeteo.ru/weather-belgorod-5039/" class="a0a35007699 e64913e36c4 c678c15222a aa762d35258 ">
                        <span class="a8315a764b4">Белгород</span>
                    </a>
                </div>
            
                <div class="f6ff4330926">
                    <a href="https://www.gismeteo.ru/weather-volgograd-5089/" class="a0a35007699 e64913e36c4 c678c15222a aa762d35258 ">
                        <span class="a8315a764b4">Волгоград</span>
                    </a>
                </div>


Жду вашей помощи, спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2018, 20:39
Ответы с готовыми решениями:

Парсинг погоды с Gismeteo
Здравствуйте. Помогите правильно и рационально спарсить погоду с xml версии Gismeteo...

Парсер погоды вызывает вылет отладчика
Пишу простенький парсер погоды. Хотел взглянуть на содержимое XML, переменная которого находится в...

Парсер данных с сайта
Добрый день. Ищу так сказать идеи. Хочу написать программу, которая бы доставал с сайта данные,...

Как написать парсер фотографий с сайта
Всем привет.нужн парсер фотографий с 1 сайта.Поможет кто ?

12
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,271
Записей в блоге: 1
04.06.2018, 21:05 2
kiwokr, для приведенного кода нужно делать так
C#
1
2
3
var parser = new HtmlParser();
var document = parser.Parse(source);
var result = document.QuerySelectorAll("a.a0a35007699.e64913e36c4.c678c15222a.aa762d35258");
Но лично у меня этот код не работает. Работает такой:
C#
1
var result = document.QuerySelectorAll("#noscript a");
1
182 / 145 / 94
Регистрация: 30.07.2013
Сообщений: 579
04.06.2018, 21:46 3
kiwokr,

А использование api не рассматривается?

https://www.gismeteo.ru/api/
1
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
04.06.2018, 22:02  [ТС] 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
var result = document.QuerySelectorAll("#noscript a");
у меня тоже работает Т.е. из-за использования какого-то скрипта определяющего наиболее популярные города блокируется LINQ запрос ?
Цитата Сообщение от meridbt Посмотреть сообщение
А использование api не рассматривается?
К сожалению нет
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,271
Записей в блоге: 1
04.06.2018, 22:09 5
Цитата Сообщение от kiwokr Посмотреть сообщение
Т.е. из-за использования какого-то скрипта определяющего наиболее популярные города блокируется LINQ запрос ?
Нет. В документе просто отсутствует указанный тобой html.
0
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
04.06.2018, 22:10  [ТС] 6
Цитата Сообщение от OwenGlendower Посмотреть сообщение
var result = document.QuerySelectorAll("#noscript a");
Не очень понимаю. Это же у меня просто текст, который можно например регулярными выражениями распарсить (но это не кошерно, как по мне). Т.е. LINQ должен же просто проверить значение class у тега a и выбрать те которые соответствуют некоторому введенному значению, разве нет? Можете как-то объяснить в чем причина такой ситуации или хотя бы направление в гугл указать
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,271
Записей в блоге: 1
05.06.2018, 01:51 7
Цитата Сообщение от kiwokr Посмотреть сообщение
Т.е. LINQ должен же просто проверить значение class у тега a и выбрать те которые соответствуют некоторому введенному значению, разве нет?
Да. Именно это он и делает. Но раз ничего не возвращается значит элементов удовлетворяющих условию нет.

Цитата Сообщение от kiwokr Посмотреть сообщение
или хотя бы направление в гугл указать
Думаю тебе нужно изучить CSS селекторы.
0
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
05.06.2018, 10:24  [ТС] 8
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Да. Именно это он и делает. Но раз ничего не возвращается значит элементов удовлетворяющих условию нет.
Почему тогда не находит ни 1 значения с условием item => item.ClassName != null ? Про CSS я более менее осведомлен, но прочитаю ещё разок, спасибо. Но проблему я так и не понял,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Нет. В документе просто отсутствует указанный тобой html.
что вы имели ввиду ? в документе целиком вся страница, заливал в тхт проверял всё на месте и отличий нету. Какая-то борода с Anglesharp но я не могу найти тех доки нормальные его, либо поверхностные какие-то сведения, либо вообще просто описание, скоро наверное придется копаться по репозиторию и искать исходники этих методов и смотреть почему такие ситуации могут возникать...
0
Эксперт .NET
12504 / 8688 / 1310
Регистрация: 21.01.2016
Сообщений: 32,637
05.06.2018, 11:37 9
Цитата Сообщение от kiwokr Посмотреть сообщение
К сожалению нет
Почему?
0
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
05.06.2018, 11:47  [ТС] 10
Цитата Сообщение от Usaga Посмотреть сообщение
Почему?
Потому, что в задании требуется написать парсер главной страницы, да и в апи нету списка этих популярных городов.

Добавлено через 3 минуты
Usaga, вы лучше объясните мне, что за бред с Anglesharp-ом? Почему он не вытягивает данные? В чём собственно ошибка? С точки зрения LINQ всё правильно, если я правильно понимаю логику парсера, то тоже всё должно работать, но оно не работает...
0
Эксперт .NET
12504 / 8688 / 1310
Регистрация: 21.01.2016
Сообщений: 32,637
05.06.2018, 11:52 11
kiwokr, никакого бреда. Нужно верный селектор описать. И нужно не забывать, что то, что вы видите в браузере может сильно отличаться от того, что видит AngleSharp, ибо в браузере может крутиться JS-скрипт, который может менять DOM. AngleSharp никаких скриптов не исполняет (это парсер).
1
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
05.06.2018, 12:03  [ТС] 12
Действительно я затупок...чем вчера смотрел не понятно...
CSS
1
2
3
 <!-- City frame --><noscript id="noscript"><a href="/weather-barnaul-4720/" data-id="4720" data-name="Барнаул" data-nameP="в Барнауле" data-countrycapital="" data-url="/weather-barnaul-4720/" alt="Погода в Барнауле" title="Погода в Барнауле">Погода в Барнауле</a>,
            <a href="/weather-belgorod-5039/" data-id="5039" data-name="Белгород" data-nameP="в Белгороде" data-countrycapital="" data-url="/weather-belgorod-5039/" alt="Погода в Белгороде" title="Погода в Белгороде">Погода в Белгороде</a>,
            <a href="/weather-volgograd-5089/" data-id="5089" data-name="Волгоград" data-nameP="в Волгограде" data-countrycapital="" data-url="/weather-volgograd-5089/" alt="Погода в Волгограде" title="Погода в Волгограде">Погода в Волгограде</a>
0
Администратор
Эксперт .NET
17567 / 13789 / 5299
Регистрация: 17.03.2014
Сообщений: 28,271
Записей в блоге: 1
05.06.2018, 12:26 13
Цитата Сообщение от Usaga Посмотреть сообщение
AngleSharp никаких скриптов не исполняет (это парсер).
Небольшая поправка. AngleSharp умеет выполнять скрипты, если его настроить соответвующим образом. Насколько хорошо он это делает сказать не могу. Это все таки парсер, а не полноценный браузерный движок.
1
05.06.2018, 12:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2018, 12:26
Помогаю со студенческими работами здесь

html парсер (как обойти защиту сайта)
Здравствуйте! Столкнулся с такой проблемой, что через некоторое время сайт блокирует меня (мой...

Парсер сайта, копирование нескольких переменных по одному условию
Добрый день! Столкнулся с проблемой, в исходном коде сайта есть: &lt;td class=td_field&gt;-&lt;/td&gt;...

Парсер сайта с подгружаемой информацией
Добрый вечер. Нужно парсить сайт, с подгружаемыми данными. Проблема в том, что информация...

Парсер ссылок сайта - ошибка 404
{ WebClient client = new WebClient(); Stream stream =...


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

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