using System.Collections.Generic;
public static void Main()
public long id { get; set; }
public string nombre { get; set; }
public string json { get; set; }
public class SubTipoDeFondo
public long id { get; set; }
public string nombre { get; set; }
public Tipo tipo { get; set; }
public string json { get; set; }
public long id { get; set; }
public Decimal valor { get; set; }
public SubTipoDeFondo tipo { get; set; }
public Tipo tipoValor { get; set; }
public string json { get; set; }
public IList<Tipo> tiposDeFondo { get; set; }
public IList<Tipo> tiposDeValores { get; set; }
public IList<SubTipoDeFondo> subTiposDeFondo { get; set; }
public IList<Valor> valores { get; set; }
public DateTime? date { get; set; }
tiposDeFondo = new List<Tipo>();
tiposDeValores = new List<Tipo>();
subTiposDeFondo = new List<SubTipoDeFondo>();
valores = new List<Valor>();
var htmlString = getSanitizedHtml(@"https://www.santanderrio.com.ar/ConectorPortalStore/Rendimiento");
var nodesStringList = htmlString.Split('\n');
date = completeDate(nodesStringList);
completeLists(nodesStringList);
public string getRawHtml(string url)
HtmlWeb web = new HtmlWeb();
var htmlDoc = web.Load(url);
return htmlDoc.DocumentNode.InnerHtml;
public string getSanitizedHtml(string url)
var rawHtml = getRawHtml(url);
public DateTime completeDate(string[] url)
DateTime temp = DateTime.Now;
var dateLine = url.Where(x => x.Contains("Rendimiento")).FirstOrDefault();
var dateString = dateLine.Split(' ').Where(x => DateTime.TryParse(x, out temp)).FirstOrDefault();
if (dateString == string.Empty)
throw new Exception ("No se ha podido extraer la fecha");
public void completeLists(string[] url)
for(long i = 0; i < url.Count(); i++)
var line = url[i].Trim();
if(line.StartsWith("<th rowspan=\"2\">"))
var lenght = line.Length;
var closeIndex = line.IndexOf('>');
var lastOpenIndex = line.LastIndexOf('<');
var text = line.Substring(closeIndex + 1, lenght - closeIndex - (lenght - lastOpenIndex) - 1).Trim();
if (!tiposDeValores.Any(x => x.nombre == text))
var itemTDV = new Tipo();
itemTDV.id = tiposDeValores.Count() + 1;
tiposDeValores.Add(itemTDV);
if(line.StartsWith("<th colspan=\"6\" class=\"th2\" height=\"20\">") && !line.Contains("Rendimientos"))
var itemTDF = new Tipo();
itemTDF.id = tiposDeFondo.Count() + 1;
var lenght = line.Length;
var closeIndex = line.IndexOf('>');
var lastOpenIndex = line.LastIndexOf('<');
itemTDF.nombre = line.Substring(closeIndex + 1, lenght - closeIndex - (lenght - lastOpenIndex) - 1).Trim();
tiposDeFondo.Add(itemTDF);
if(line.StartsWith("<td style='border-width:0px; padding: 1px; background-color:transparent;' nowrap=\"\" align=\"left\" width=\"90%\">"))
var itemSTDF = new SubTipoDeFondo();
itemSTDF.id = subTiposDeFondo.Count() + 1;
itemSTDF.nombre = url[i+1].Trim();
itemSTDF.tipo = tiposDeFondo.Where(x => x.id == tiposDeFondo.Count()).Single();
subTiposDeFondo.Add(itemSTDF);
if(line.StartsWith("<td align=\"right\" class=\"\">"))
itemV.id = valores.Count() + 1;
itemV.tipoValor = tiposDeValores.Where(x => x.id == itemValorColumn).Single();
itemV.tipo = subTiposDeFondo.Where(x => x.id == subTiposDeFondo.Count()).Single();
var lenght = line.Length;
var closeIndex = line.IndexOf('>');
var lastOpenIndex = line.LastIndexOf('<');
var valueText = line.Substring(closeIndex + 1, lenght - closeIndex - (lenght - lastOpenIndex) - 1).Trim();
bool isNegative = valueText.Contains('(') || valueText.Contains(')');
valueText = valueText.Replace("(","").Replace(")","").Replace(".","").Replace(",",".");
itemV.valor = Convert.ToDecimal(valueText);
Console.WriteLine(valueText);
if (itemValorColumn == 7)
var strList = new List<String>();
foreach (var item in tiposDeValores)
var text = "{\"id\":" + item.id.ToString() + ",\"nombre\":\"" + item.nombre + "\"}";
var jsonTDV = String.Join(",",strList.ToArray());
foreach (var item in tiposDeFondo)
var text = "{\"id\":" + item.id.ToString() + ",\"nombre\":\"" + item.nombre + "\"}";
var jsonTDF = String.Join(",",strList.ToArray());
foreach (var item in subTiposDeFondo)
var text = "{\"id\":" + item.id.ToString() + ",\"nombre\":\"" + item.nombre
+ "\",\"tipo\":" + item.tipo.json + "}";
var jsonSTDF = String.Join(",",strList.ToArray());
foreach (var item in valores)
var text = "{\"id\":" + item.id.ToString() + ",\"valor\":" + item.valor.ToString()
+ ",\"tipoValor\":" + item.tipoValor.json
+ ",\"tipo\":" + item.tipo.json + "}";
var jsonV = String.Join(",",strList.ToArray());
"\"fecha\":\"" + date.Value.ToShortDateString() + "\"," +
"\"tiposDeFondo\":[" + jsonTDF + "]," +
"\"tiposDeValores\":[" + jsonTDV + "]," +
"\"subTiposDeFondo\":[" + jsonSTDF + "]," +
"\"valores\":[" + jsonV + "]" +
Console.WriteLine("{\"TiposDeFondo\":[" + jsonTDF + "]}");
Console.WriteLine("{\"SubTiposDeFondo\":[" + jsonSTDF + "]}");
Console.WriteLine("{\"TiposDeValor\":[" + jsonTDV + "]}");