Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
1

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

04.06.2018, 20:39. Просмотров 1208. Ответов 12

Всем доброго времени суток. Столкнулся с проблемой и честно говоря не могу понять в чём причина. Стоит задача вытянуть с главной страницы сайта 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2018, 20:39
Ответы с готовыми решениями:

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

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

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

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

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

12
OwenGlendower
Супер-модератор
Эксперт .NET
10601 / 9111 / 3885
Регистрация: 17.03.2014
Сообщений: 18,241
Записей в блоге: 1
Завершенные тесты: 2
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
meridbt
134 / 110 / 80
Регистрация: 30.07.2013
Сообщений: 428
Завершенные тесты: 1
04.06.2018, 21:46 3
kiwokr,

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

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

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

Добавлено через 3 минуты
Usaga, вы лучше объясните мне, что за бред с Anglesharp-ом? Почему он не вытягивает данные? В чём собственно ошибка? С точки зрения LINQ всё правильно, если я правильно понимаю логику парсера, то тоже всё должно работать, но оно не работает...
0
Usaga
Эксперт .NET
5729 / 3960 / 706
Регистрация: 21.01.2016
Сообщений: 15,553
Завершенные тесты: 2
05.06.2018, 11:52 11
kiwokr, никакого бреда. Нужно верный селектор описать. И нужно не забывать, что то, что вы видите в браузере может сильно отличаться от того, что видит AngleSharp, ибо в браузере может крутиться JS-скрипт, который может менять DOM. AngleSharp никаких скриптов не исполняет (это парсер).
1
kiwokr
3 / 3 / 1
Регистрация: 01.07.2016
Сообщений: 59
Завершенные тесты: 1
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
OwenGlendower
Супер-модератор
Эксперт .NET
10601 / 9111 / 3885
Регистрация: 17.03.2014
Сообщений: 18,241
Записей в блоге: 1
Завершенные тесты: 2
05.06.2018, 12:26 13
Цитата Сообщение от Usaga Посмотреть сообщение
AngleSharp никаких скриптов не исполняет (это парсер).
Небольшая поправка. AngleSharp умеет выполнять скрипты, если его настроить соответвующим образом. Насколько хорошо он это делает сказать не могу. Это все таки парсер, а не полноценный браузерный движок.
1
05.06.2018, 12:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.06.2018, 12:26

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru