private ComposicaoCapital ParseComposicaoCapitalCvm(string content) { var parser = new HtmlParser(); var doc = parser.Parse(content); ComposicaoCapital capital = new ComposicaoCapital(); var div = doc.QuerySelector("#UltimaTabela"); var table = div.Children.Where(e => e.LocalName == "table").First() as IHtmlTableElement; bool tesouraria = false; foreach (var row in table.Rows) { if (row.Cells[0].TextContent.Contains("Ações")) //primeira linha { //obtem a data da segunda célula capital.Date = DateTime.ParseExact(row.Cells[1].TextContent.Trim(), "dd/MM/yyyy", new CultureInfo("pt-BR")); } if (row.Cells[0].TextContent.Contains("Capital")) //segunda linha { // acoes no mercado tesouraria = false; continue; } if (row.Cells[0].TextContent.Contains("Tesouraria")) { // acoes em tesouraria tesouraria = true; continue; } if (row.Cells[0].TextContent.Contains("Ordinárias")) { var value = Convert.ToDecimal(row.Cells[1].TextContent.Trim()); if (tesouraria) { capital.OrdinariasTesouraria = value; } else { capital.OrdinariasCirculantes = value; } } if (row.Cells[0].TextContent.Contains("Preferenciais")) { var value = Convert.ToDecimal(row.Cells[1].TextContent.Trim()); if (tesouraria) { capital.PreferenciaisTesouraria = value; } else { capital.PrefernciaisCirculantes = value; } } } return(capital); }
public async Task ScrapComposicaoCapital(DocLinkInfo link) { if (!DoINeedToExtractComposicaoCapital(link)) { return; } var fileinfo = new FileInfo(Company.GetFinDataCapitalFileName(link)); var url = ""; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { url = "http://www2.bmfbovespa.com.br/dxw/FormDetalheDXWG1CompCapital.asp"; } else //cvm { var codTipoDocumento = 0; if (link.DocType == DocInfoType.ITR) { codTipoDocumento = 3; } if (link.DocType == DocInfoType.DFP) { codTipoDocumento = 4; } url = $"https://www.rad.cvm.gov.br/ENETCONSULTA/frmDadosComposicaoCapitalITR.aspx?Grupo=&Quadro=&NomeTipoDocumento=&Titulo=&Empresa=&DataReferencia=&Versao=&CodTipoDocumento={codTipoDocumento}&NumeroSequencialDocumento={link.NumeroSequencialDocumento}&NumeroSequencialRegistroCvm={Company.CodigoCVM}&CodigoTipoInstituicao=2"; } var content = await GetAsync(link, url); ComposicaoCapital capital = null; if (link.LinkType == DocLinkInfo.LinkTypeEnum.Bovespa) { capital = ParseComposicaoCapitalBovespa(content); } else //cvm { capital = ParseComposicaoCapitalCvm(content); } capital.Save(fileinfo.FullName); }
private ComposicaoCapital ParseComposicaoCapitalBovespa(string content) { var parser = new HtmlParser(); var doc = parser.Parse(content); ComposicaoCapital capital = new ComposicaoCapital(); var tds_titles = doc.QuerySelectorAll("td.label"); var table = tds_titles[0].ParentElement.ParentElement.ParentElement as IHtmlTableElement; // walk the rows //var tr = tr_title.NextElementSibling as IHtmlTableRowElement; //if (tr.Cells[0].TextContent.Contains("Integralizado")) //{ // tr = tr.NextElementSibling as IHtmlTableRowElement; //} //// Ordinárias mercado //if (tr.Cells[0].TextContent.Contains("Ordinárias")) //{ // var text = tr.Cells[1].TextContent.Trim(); // capital.OrdinariasCirculantes = (string.IsNullOrWhiteSpace(text) ? 0 : Convert.ToDecimal(text)); // tr = tr.NextElementSibling as IHtmlTableRowElement; //} //// Preferenciais mercado //if (tr.Cells[0].TextContent.Contains("Preferenciais")) //{ // var text = tr.Cells[1].TextContent.Trim(); // capital.PrefernciaisCirculantes = (string.IsNullOrWhiteSpace(text) ? 0 : Convert.ToDecimal(text)); // tr = tr.NextElementSibling as IHtmlTableRowElement; //} //if (tr.Cells[0].TextContent.Contains("Tesouraria")) //{ // tr = tr.NextElementSibling as IHtmlTableRowElement; //} //// Ordinárias tesouraria //if (tr.Cells[0].TextContent.Contains("Ordinárias")) //{ // var text = tr.Cells[1].TextContent.Trim(); // capital.OrdinariasTesouraria = (string.IsNullOrWhiteSpace(text) ? 0 : Convert.ToDecimal(text)); // tr = tr.NextElementSibling as IHtmlTableRowElement; //} //// Preferenciais tesouraria //if (tr.Cells[0].TextContent.Contains("Preferenciais")) //{ // var text = tr.Cells[1].TextContent.Trim(); // capital.PreferenciaisTesouraria = (string.IsNullOrWhiteSpace(text) ? 0 : Convert.ToDecimal(text)); // //tr = tr.NextElementSibling as IHtmlTableRowElement; //} bool tesouraria = false; foreach (var row in table.Rows) { if (row.GetAttribute("align") == "left") //primeira linha { //obtem a data da segunda célula var td_multiplicador = row.Cells[0]; var td_date = row.Cells[1]; var datetext = td_date.TextContent.Trim(); var iEnd = datetext.LastIndexOfNum(); var start = iEnd - 9; datetext = datetext.Substring(start, 10); capital.Date = DateTime.ParseExact(datetext, "dd/MM/yyyy", new CultureInfo("pt-BR")); if (td_multiplicador.TextContent.Contains("Mil") || td_multiplicador.TextContent.Contains("Milhares")) { capital.Multiplicador = 1000; } if (td_multiplicador.TextContent.Contains("Milhão") || td_multiplicador.TextContent.Contains("Milhões")) { capital.Multiplicador = 1000 * 1000; } } if (row.Cells[0].TextContent.Contains("Capital")) //segunda linha { // acoes no mercado tesouraria = false; continue; } if (row.Cells[0].TextContent.Contains("Tesouraria")) { // acoes em tesouraria tesouraria = true; continue; } if (row.Cells[0].TextContent.Contains("Ordinárias")) { var value = Convert.ToDecimal(row.Cells[1].TextContent.Trim()); if (tesouraria) { capital.OrdinariasTesouraria = value; } else { capital.OrdinariasCirculantes = value; } } if (row.Cells[0].TextContent.Contains("Preferenciais")) { var value = Convert.ToDecimal(row.Cells[1].TextContent.Trim()); if (tesouraria) { capital.PreferenciaisTesouraria = value; } else { capital.PrefernciaisCirculantes = value; } } } return(capital); }