В настоящее время я пытаюсь удалить некоторые записи из таблицы веб-сайта, но когда я делаю запрос на получение, строковый ответ не включает те записи, которые отображаются на веб-сайте.
Вот сайт: https://www.services-rte.com/en/view-data-published-by-rte/downtime-of-generation-resources.html
Я предполагаю, что мне нужно сделать запрос на публикацию, чтобы загрузить таблицу, но я не могу найти, что именно опубликовать. Поправьте меня, если я ошибаюсь.
Вот мой код
static async void GetEntries()
{
var services = new ServiceCollection();
services.AddHttpClient();
var serviceProvider = services.BuildServiceProvider();
var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
var client = httpClientFactory.CreateClient();
string response = string.Empty;
try
{
response = await client.GetStringAsync("https://www.services-rte.com/en/view-data-published-by-rte/downtime-of-generation-resources.html");
}
catch
{
Console.WriteLine("Site not found.");
return;
}
var parser = new HtmlParser();
var document = parser.ParseDocument(response);
string content = string.Empty;
for (int i = 1; i <= 20; i++)
{
try
{
Console.WriteLine(i);
content = document.QuerySelector($"#wrapper > div > div > div.c-editorial-page__container > div.c-editorial-page__content > ctx-remit-generation-unavailability > cortex-remit-generation-unavailability-table > cortex-table > div > div.ctx__table_content > cortex-table-row:nth-child({i})").TextContent;
}
catch
{
Console.WriteLine($"CSS selector not found for {i}.");
continue;
}
Console.WriteLine(content);
Console.WriteLine("NEW");
}
}
Ошибка в этой строке: content = document.QuerySelector($"#wrapper > div > div > div.c-editor-page__container > div.c-editor-page__content > ctx-remit-generation-unavailability > cortex-remit-generation- таблица недоступности > таблица-коры > div > div.ctx__table_content > строка-таблицы-коры: n-й дочерний элемент ({i})").TextContent;
В экземпляре объекта не задана ссылка на объект.
Я знаю, что API существует, но я специально хочу получить данные из Интернета. Разве я не могу вызвать функцию, которая генерирует таблицу?
Нет, это Javascript
@MegaPaul: веб-скрапинг — это упражнение по обратному инжинирингу. В идеале вы могли бы вместо этого взаимодействовать с API. Но если это недоступно, вы зависите от любой функциональности, создающей эту страницу в браузере. Вы можете использовать инструменты отладки своего браузера, чтобы наблюдать за взаимодействием страницы с сервером и пытаться воспроизвести эту функциональность. Вы также можете попробовать использовать «безголовый браузер», который включает в себя полный движок браузера в коде, чтобы выполнять JavaScript и еще много чего на странице и отображать результат в памяти.
@MegaPaul: «Я знаю, что API существует, но я специально хочу удалить данные из Интернета». - Почему? Для чего? Если ваша цель — получить данные, то именно так вы их и получите. Если ваша цель — попрактиковаться в очистке страницы, выберите страницу, содержащую данные.
хорошо, как вы нашли функцию или js, которые генерируют таблицу кстати?
@MegaPaul: откройте инструменты разработчика/отладки вашего браузера и наблюдайте за запросами/ответами на вкладке «Сеть».
тут вроде сотни скриптов как ты отличил нужный?
@MegaPaul: Если что-то генерируется динамически, то мой первый шаг — перейти на вкладку «Сеть», отфильтровать запросы AJAX (HXR) и просмотреть их, чтобы найти данные, которые выглядят так, как в этой таблице. Конечно, нет никакой гарантии, что это где-то найти. Опять же, вы зависите от того, как спроектирован тот или иной веб-сайт. И любой конкретный веб-сайт вполне может быть разработан таким образом, что его будет чрезвычайно сложно очистить.
Я думаю, что данные загружаются асинхронно? Я имею в виду таблицу на сайте. Однажды у меня была эта проблема: я видел HTML на веб-сайте, но когда я сделал запрос через С#, я не смог найти HTML.
Что вы можете сделать, так это использовать что-то вроде Selenium. Я знаю, что это может быть не лучший ответ, потому что я не могу показать вам, как его использовать, но есть плагин Selenium, который вы можете использовать в C#. Это может работать с веб-сайтами, которые загружают данные асинхронно.
Возможно, вам поможет этот сайт: https://www.scrapingdog.com/blog/web-scraping-with-csharp/ (не мой, но выглядит многообещающе).
Эта таблица создается другим вызовом для получения JSON, похоже, было бы намного проще, если бы вы сделали то же самое, просто ПОЛУЧИТЕ эту страницу (конечно, с динамической строкой запроса): services-rte.com/api/public/ …