public async Task <List <BalanceSheet> > ScrapeBalanceSheet(string ticker, string apiKey) { #region Data from QuickFS var url = $" https://api.quickfs.net/stocks/{ticker}:US/bs/Annual/{apiKey}"; var helper = new WebHelper(); var request = await helper.ComposeWebRequestGet(url); var result = await helper.CallWebRequest(request); result = result.Replace("<\\/td>", ""); var html = new HtmlAgilityPack.HtmlDocument(); html.LoadHtml(result); var htmlNodes = html.DocumentNode.Descendants("td").ToList(); #endregion #region DataOrganization #region WordRemover var word = "Liabilities & Equity"; var isDeleted = false; foreach (var nodeItem in htmlNodes.ToList()) { if (nodeItem.InnerHtml.Equals(word) && isDeleted == false) { nodeItem.InnerHtml = ""; isDeleted = true; } } #endregion var numberOfColumns = html.DocumentNode.SelectNodes("//tr[@class='thead']").Descendants("td").ToList().Count(); var numberOfRows = htmlNodes.Count / numberOfColumns; var count = 1; var extractedValuesList = new List <ExtractedValues>(); var valuesFinalList = new List <float>(); var balanceSheets = new List <BalanceSheet>(); for (var i = 1; i < numberOfColumns; i++) { var parsedYear = int.TryParse(htmlNodes[i].InnerText, out int yearNumber); //if (!parsedYear) return; lançar exceção for (var j = 1; j < numberOfRows; j++) { var extractedValues = new ExtractedValues(); var baseItems = new BaseItem(); var name = htmlNodes[j * numberOfColumns].InnerText; baseItems.Name = name; var valuesList = new List <string>(); foreach (var item in htmlNodes) { var htmlValue = item.GetAttributeValue("data-value", null); valuesList.Add(htmlValue); } var valuesFromNodes = valuesList[(j * numberOfColumns) + count]; bool parsedFloat = float.TryParse(valuesFromNodes, NumberStyles.Float, CultureInfo.InvariantCulture, out float valuesFloat); valuesFinalList.Add(valuesFloat); if (yearNumber != 0 && name != "" && name != "Assets") { extractedValues.Year = yearNumber; baseItems.Name = name; baseItems.Value = valuesFloat; extractedValues.Items.Add(baseItems); extractedValuesList.Add(extractedValues); } } #endregion #region Add to BalanceSheet var balanceSheet = new BalanceSheet(); foreach (var extractedItem in extractedValuesList) { var props = balanceSheet.GetType().GetProperties(); balanceSheet.Year = extractedItem.Year; foreach (var prop in props) { var displayAttribute = prop.GetCustomAttributes <DisplayAttribute>().SingleOrDefault(); if (displayAttribute != null) { var item = extractedItem.Items.SingleOrDefault(i => i.Name == displayAttribute.Name); if (item != null) { prop.SetValue(balanceSheet, item.Value); } } } } if (balanceSheet.Year != 0) { balanceSheets.Add(balanceSheet); } #endregion } Random rnd = new Random(); await Task.Delay(TimeSpan.FromSeconds(rnd.Next(1, 10))); return(balanceSheets); }