Делаем парсер HTML на C#
HTML-код
- Опубликовано: 3 окт 2024
- Всем привет! В этом видео уроке мы сделаем HTML парсер на C#.
► ► ► ► ► ► ►
Проект bit.ly/2m70LtE
► ► ► ► ► ► ►
C# в Unity bit.ly/2lrwIdN
► ► ► ► ► ► ►
C# для студентоты bit.ly/2ld0xka
► ► ► ► ► ► ►
C# для маленьких и тупых: bit.ly/2lmEtR4
► ► ► ► ► ► ►
VK: extreme...
Спасибо, хоть ролик и идет 20 минут, но я потратил на его просмотр около 4 дней вникая в интерфейсы, обобщения и прочее, узнал много полезного вообщем)
Черт, я чувствую себя умным! Я понимаю, что тут происходит! Продолжай выпускать такие простые ролики))
Большое тебе спасибо за видео.
Это моё первое видео, которое я смотрю на твоём канале, и оно очень сильно меня радует. Обязательно подписываюсь! :)
У HtmlParser уже нет такого метода ParseAsync, теперь он называется ParseDocumentAsync
Благодарю дружище помог)
HttpParser не находит, не знаешь в чем проблема?
То чувство когда начинаешь понимать что такое интерфейсы, как их реализовывают ...
Может раньше и работало, но сейчас в классе HtmlLoader нужно в строке url = $"{settings.BaseUrl}/{settings.Prefix}/"; убрать один слеш между скобок. Вот так - url = $"{settings.BaseUrl}{settings.Prefix}/"; Иначе будет парсить на одной странице.
Чувак ты самый лучший!!!! Удачи тебе во всем!
Было бы шикарно увидеть этот парсер, но в обертке MVC/MVP или MVVM)
Дядечка айПро , респект тебе от английского комьюнити и уважение от пацанов , помог
И вот уже почти 2020 год, а второй части так и нет(( за слова не отвечаешь ска!!!(тип агро)
А он разве говорил за вторую часть?
@@AzizjanAyupov_leo говорил 23:41
@@ВладиславЗамікула и правда!
Крутяк! Давно хотел научиться парсить сайты и тут на этот урок наткнулся. Всё понятно объясняешь, красиво кодишь и шутеички в меру. Снимаю шляпу, качаю проект.
Сразу не запустилось. Нужно обновить AngleSharp и перед отправкой запроса в строке var response = await client.GetAsync(currentUrl); выполнить ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
В идеале бы @ExtremeCode мой пулл реквест принял - там всё готово уже.
Парни, респект. Отличный видос. С удовольствием повторил, многому научился.
Ну вот опять. Видео 24 минуты идёт, а делаешь всё 2-3 часа, ибо надо загуглить все непонятные моменты.
ска, а их много ;)
что то пошло не так в Parser Worker в вызове метода //// короче var htmlparser = new HtmlParser();
var doc = await htmlparser.ParseDocumentAsync(нет ParseAsync() (( чем его заменить ))(source.ToString(),System.Threading.CancellationToken.None);
var result =Parser.Parse(doc);
помог. очень помог. не знаю, почему другие с такой же проблемой не столкнулись
так пакеты обновляются постоянно, методы изменяются, тут либо использовать старую версию как у автора или читать документацию
у меня при создании экземпляра HtmlParser падает, пишет:
"Additional information: Не удалось загрузить файл или сборку "System.Text.Encoding.CodePages, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" либо одну из их зависимостей. Не удается найти указанный файл."
Хотя я воспользовался подсказкой и все красные подчеркивания убрались.
Нагуглил что то про добавление в конфиг этого:
но не помогло, ошибок нет, но падает
Ты просто лучший!)
После тяжелого рабочего дня твои видосики словно бальзам!)
Вот никуя не понятно, но один х интересно смотреть
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
А я понял только после самостоятельного прочтения на GitHub)
Фу фу фу за WF. Кодинг с юмором мне заходит. Лайк, подписка
Нихуя не понял, но очень интересно!
Спасибо за видео, давно его ждал.
Отличный канал!
Пиздатый код. Пиздатое ооп. Пиздатый парсер
Ну ви іздіваєтися, превратили один маленький клас, в цілий проект!
вау,вот это оперативно только бахнул вопрос. на трансляции про парсер и вуаля) класс спасибо!Лайк жирнющий!
я конечно не эксперт да и видео уже попахивает "актуальной" информацией но на моменте 6:34 разве не лучше ли было использовать Select, (и выбрать нужное свойство вместо того чтобы всё в лист через цикл записывать), а потом сразу же вызвать метод ToArray(), или это такой High Level стёб который слишком крут для меня ?
Ждем вторую часть)
До конца еще не досмотрел но вот комментарии автора просто чумовые! )
Привет! Помнишь давным давно, вы писали парсер proxy?(Кто помнит и видел ставьте лайк ;)) Так вот, не мог бы ты запилить видосик про proxy checker. Выручи плиз)).
P.S. Я думаю в тему "C# - Туториалы" норм будет!
Geek_ _ присоединяюсь
Geek_ _ , ай ай ай ))))
Повторил за автором, 5 лет дали о себе знать, 20 ошибок....
Мудрено, но понятно) Лукас!
Спасибо, хорошая работа парень!
а я использую Selenium для этих целях. Парсить через CSS либо XPath. Удобно, когда надо парсить защищенного текста.
Кажется я не туда полез, мне сюда ещё рано(
А вообще спасибо за видео, хороший пример наглядного использования интерефейсов да еще и обобщенных
братик, спасиб от души душевно в душу
+лайк +подписка
Как же ты классно это записал, лайк тебе за креативность и полезность информации. Спасибо
Сделал на .net core 3.1 буква в букву, всё отлично работает.
Молодец, шо тут сказать, юмор прикольный)
В конце, когда делаешь форму, невозможно что-то успеть разглядеть, если не жать постоянно паузу и не отматывать назад много раз.
Так ведь придется еще раз смотреть этот отрывок после создания формы, чтобы послушать твою речь.
Найс...
Сделай видео где можно было парсить более сложные вещи бро! Спасибо
>Делаем парсер
>HTMLDocument
Неплохо
Как сделать чтобы отлавливал теги которые находятся в теге ? Он тупо не видит все что внутри этого тега , хотя то, что внутри так же подходит под параметры. Вот пример:
Моя строка в классе "HabraParser" :
var items = document.QuerySelectorAll("span").Where(x => x.ClassName != null && x.ClassName.Contains("q"));
А вот кусок HTML кода, в котором есть строка, которая подходит под параметры выборки:
....
Оглушает цель на 5 сек.. Действует только на замороженных противников.
....
Но парсер не индексирует то, что находится в теге (в остальном все работает).
Как заставить его индексировать внутри ? Не хочется брать целиком весь и регулярными выражениями выбирать все это.
Спосибо тебе, дядюшка IPro
async void это не преступление? для abort не логичнее ли использовать CancelationToken?
iPro, большое спасибо. Продолжай!
спасибо, как раз что нужно для моего говно-парсера с моими копирайтами
задумка та же, но придется еще научить открывать его страницы и жмакать на кнопки внутри них
Отличный видос) Жаль, что парсер не подойдёт для тех, кто узнаёт о количестве страниц из пагинации, к примеру :)
Спасибо)
Очень помог)
Все очень круто, а кто-нибудь парсер погоды делал из этого?
удалось сделать ? у меня одна страница на yandex.ru/pogoda/novosibirsk/details?via=mf#2 соответственно мне не нужен переход страниц и я застрял блин.
вопрос почему вы используете в классе ParserWorker в приватном методе Worker() - async void а не async Task? это же не метод обработчик события
Привет, тут все просто, грубо говоря, если необходимо дожидаться выполнения асинхронного метода через await, то делаем его тип Task, если не нужно - то не делаем, в нашем контексте этот метод просто работает в фоне, и информирует о завершении с помощью события, так что тип Task тут не используется
а экспеншны(теоретические если такоевые будут) куда будут вылетать?
Можно делать Task и не дожидаться его. Очень много тем есть на этот счет, мол почему лучше юзать Task, а не void (когда это возможно)
Ммм...а зачем в HarbraParser.Parse надо было добавлять это все в лист да еще и циклом?
Не надо делать интерфейсы на всё подряд. Зачем они настройкам? Вы не собираетесь их мокать, вам не нужно их переопределять. А уж тем более нельзя чтобы настройки как то по разному генерили поля. То есть настройки это обычный картеж данных передаваемых в процедуру / класс и тд. Они должны быть константы в сути своей.
Ну я захочу переопределить, помокать и даже по разному генерить поля. Идёт расчёт на то, что тот, кто просмотрел видос, сможет допилить ручонками требуемый функционал.
ыПро, спасибо за C#! Мистя, а к тебе все еще остается один вопрос: Где C# ???
Классный туториал)
Но зачем, а главное нахуя создавать property IsActive если всё равно его не используешь?))
Какой клиент лучше юзать для парсинга ? http или webclient ?
А можете рассказать как из всей это информации вывести только нужное тебе в другое окно (по ключевым словам)
братуля, где вторая часть?
А у вас *ус отклеился* абстракции потекли
давай продолжение.
Образцовый туториал по кодингу
Тэк будет вторая часть?))
Поделитесь пожалуйста Где можно почитать описание библиотеки "AngleSharp" для парсера и в видео вы говорили что есть где то код на исходник но я его не нашел . С уважением IVI.
Досмотрел до конца все супер спасибо пиши есче!
Ау, где вторая часть? Со сложными примерами??? Уже 4 года прошло!!
Хотел на основе этого кода забацать парсер lostfilm, который просто выводит названия из списка сериалов в listbox, но столкнулся с проблемой. Из-за того, что контент на странице генерируется динамически парсятся только первые 10 строк. Вот ролик о том как это делать, мне бы очень пригодился
посмотри тут: stackoverflow.com/questions/24130650/scraping-data-dynamically-generated-by-javascript-in-html-document-using-c-sharp или попробуй Selenium. Посмотри ещё CefSharp
Все клево но не очень жизнено. Если будет 500 с хером страниц - затрахаешься парсить. А многопоток без допиливания не завезти
Да не так уж и сложно, цикл Worker'а переделать на while, счетчик вынести в поле и синхронизовать увеличение lock'ом, в методе Start запускать нужное количество раз при помощи Task.Run, только в UI надо тоже при помощи инвоков синхронизовать вывод элементов
В реальных проектах на больших объёмах SAX parser выигрывает
Как научить парсер переходить по ссылкам и парсить данные дальше ?
Спасибо! Использую в своем проекте =)
Я нихуя не понял, но ты сделал мне проектную за 2е суток до сдачи
Спасибо за видео!
Есть вопрос, если мне нужно вытянуть УРЛы изображений со всего, не с одной страницы а со всего сайта, это возможно?
Можете помочь?
УРЛ изображения находится здесь:
div[class='img'] на тобі селектор
Давай 2-ю часть!!!!!
удивительно как человек предсказал это событие: 4:10
Понимаю, что видос старинный, но! Парсер должен быть универсальным. Пользователь должен только ввести адресс страницы, а затем уже вибирать, что с этой страницы ему надо просто просмотреть , какую-то ссылку скопировать, что -то скачать, преобразовать страницу или запустить свой скрипт на ней. Парсер также должен быть удобен в плане работы с диском ПК. И боже упаси использовать Form... слишком старая технология. Хотя-бы WPF.
Не работает проект скаченный. Просит еще какие то пакеты. AngleSharp установлен
Не подскажите? Visual studio 17
там маленькая опечатка, в одном из namespace написано Parser.Cor
когда вторая часть ?)
на 22 строке переменная типа string. присваиваете null.Разве по умолчанию она уже не равна null?
по умолчанию она = "" - (string.empty)
учус щас с++ и с# мне интересно если данные с сайта можно получить только с авторизацией как програмно сделать это? или нужен АПИ? мб есть у кого информация
Всё аккуенно понятно. Завтра попробую пильнуть. С формами ещё не работал правда, но разобраться можно
Давай вторую часть! =)
не получается гугл парсить QuerySelectorAll без результатов. такое чуство что натыкаюсь на капчу и не видно никаких классов помогите
Блин,круто))
Скачал и запустил проект, выкидывает HttpRequestException....
Слушай, мне нужно сделать которая будет сравнивать файл на сайте с файлом на компе, т.е. проверять обновление файла. если он обновился, то заменить старую версию. может подскажешь чего или видос запилишь?
string str1="any text";
string str2="any text";
bool equal=(str1==str2);//True
bool equal1 = str1.Equals(str2);//True
str2="another text";
equal=(str1==str2);//False
equal1 = str1.Equals(str2);//False
по идеи у класса String есть перегрузка оператора ==, которая неявно выполняет метод Equals, но я могу ошибаться
11:10 ОН ГЕНИЙ!!!
а что делать, если не нужен вообще префикс, например для вк? Я попробовал его убрать, не помогло(
Спасибо, как ни странно, я большинство понял и вообще заебись представляешь пособие (интересно).
А если серьезно, то через WebSockets как-то проще это делать, не очень понимаю зачем велосипед изобретать)
4:09 чудная кнопка! а что если она не появилась?
Ctrl + .
OnSomething?.Invoke(this);
Я не знаю, что это за нотация! Справочники по событиям молчат. Ткните пожалуйста!
Это короткий аналог вот такой конструкции
if(OnSomething != null)
{
OnSomething(this);
}
P.S.
Это делегат, а не событие. У делегатов есть метод Invoke, который по сути аналогичным образом вызывает метод по ссылке, оператор ? проверяет равен ли делегат OnSomething null'у, если там есть что либо, то вызывается метод Invoke со следующими аргументами
Большое спасибо, дядя iPro!
Мне кажется он имел ввиду именование "OnSomething"
Проблема с выведение данных в ListBox... У кого существуют из мимо проходящих такая проблема?
Что делать если даже не устанавливается?
Install-Package AngleSharp
Install-Package : Совпадения для указанных условий поиска и имени пакета "AngleSharp" не найдены. Чтобы просмотреть все доступные зарегистрированные источники пакетов, исполь
зуйте командлет Get-PackageSource.
строка:1 знак:1
+ Install-Package AngleSharp
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Exception
+ FullyQualifiedErrorId : NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
Спасибо!
а как ты файл создал??
А почему бы не использовать токен отмены вместо булевой переменной? :D
Я програмест, я так вижу
"Скоро эта сраная студия будет кодить за нас". Я бы сказазал даже больше. Студия будет не только говнокодить за вас, но и, если судить по этому видео, проекты автоматически ей сгенерированные будут менее "мусорными" чем написанные вами вручную.
Шта? Ещё раз своё высер прочитай-ка. И переведи для русских.
Я одноклеточным в переводчики не нанимался. Не понимаешь о чем речь - иди смотри стримы лолошки.
"Конструктивную критику" завезли))
в ruby это несколько строчек.
Ахах сука два часа смотрел все повторял писал то да се и на паузы ставил а он в конце плять - ну кодец то я оставлю )))) Ну спасибо плять)
Ну если ты как даун, просто всё переписываешь и не учишься, то зачем вообще смотреть было ?
чувак ты зэ бэст
А чё видео по удаляли?(была же годнота)
решили, что не соответствует новому формату. Если соскучился по старым видосам, можешь найти их в нашей группе в вк.
лайк неглядя
Спасибо !!!
Очень быстро, моя голова не успевает осознать все) . Приходиться на паузу ставить(
А зачем инициаривать HtmlParser в цикле for? Это можно сделать один раз вне цикла. Плюс, непонятне зачем отменять работе через переменную bool, если ты все делаешь асинхронно и можно просто впулить Cancellation Token?