На данный момент у меня есть вот такой код выборки данных:
private SerialPreviewViewModel[] GetSerials(params IHtmlCollection<IElement>[] dataElements)
{
// Обрабока коллекций циклом
return new SerialPreviewViewModel[] { };
}
public async Task<IPageModel> LoadPageAsync(Uri pageUrl)
{
IDocument document = await LoadStreamAsync(pageUrl);
IElement content = document.QuerySelector("div#dle-content");
IPaginatorModel paginator = GetPaginator(content.QuerySelector("div.navi"));
IHtmlCollection<IElement> postContentTitles = content.QuerySelectorAll("div.newstitle");
IHtmlCollection<IElement> postContentInfo = content.QuerySelectorAll("div.newsinfo");
IHtmlCollection<IElement> postContentShort = content.QuerySelectorAll("div.news_short");
PageModel result = new PageModel
(
new TaskCommand(async () => await LoadPageAsync(pageUrl)),
paginator,
GetSerials(postContentTitles, postContentInfo, postContentShort)
);
return await Task.FromResult(result);
}
private static IPaginatorModel GetPaginator(IParentNode element)
{
IHtmlCollection<IElement> paginatorData = element.QuerySelectorAll(".navigation > *");
int[] paginatorPagesList = new int[paginatorData.Length];
for (int i = 0; i < paginatorData.Length; i++)
{
IElement currentElement = paginatorData[i];
paginatorPagesList[i] = currentElement.TagName == "A"
? int.Parse(paginatorData[i].Text())
: currentElement.TagName == "SPAN" && currentElement.ClassName == "nav_ext"
? 0
: -int.Parse(paginatorData[i].Text());
}
return new PaginatorModel(Math.Abs(paginatorPagesList.First(i => Math.Abs(i) > 0)),
paginatorPagesList.Select(Math.Abs).ToArray());
}
Факт того что приходится делать выборку по 3м классам сразу в том, что тот кто писал HTML
для сайта который необходимо парсить, забыл или не захотел сделать объединение постов в один элемент, поэтому приходится извращением выбирать по 3 элемента и извлекать из каждого данные.
Можно ли сделать такую выборку, например как-то так:
div.newstitle, newsinfo, div.news_short
что бы в конечном результате получить объект коллекции который содержал бы в себе коллекции в которые были бы уложены по 3 запрошенных элемента?
Не знаю, будет ли это является правильным ответом, но что мешает завезти анонимный тип:
var result = new
{
postContentTitles = content.QuerySelectorAll("div.newstitle"),
ostContentInfo = content.QuerySelectorAll("div.newsinfo"),
postContentShort = content.QuerySelectorAll("div.news_short")
};
На выходе получаем анонимный объект, в который упакованы 3 коллекции.
Ну или если вам нужно передавать куда-то это все в метод, то заведите словарь Dictionary<string,IHtmlCollection<IElement>>
, а внутри метода по ключу получайте нужную коллекцию.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите пожалуйстаКак правильно должна применяться привязка модели в mvc
Хочу реализовать такой алгоритм
Как я понял, многое вырезали изNET CORE в угоду кроссплатформенности