none
Gerar arquivo txt a partir de uma Tabela (Grid) de um Site RRS feed

  • Pergunta

  • Bom dia!

    PessoAll por favor,

    Estou tentando gerar um arquivo .txt á partir de uma tabela (grid) do site : http://www.bmfbovespa.com.br/indices/ResumoCarteiraTeorica.aspx?Indice=IBOVESPA&idioma=pt-br já tentei de diversas forma WebBrowser, webClient e nada... Consigo pegar todo código Html da página porém, não configo pegar apenas a grid para poder gerar o arquivo.

    Teria como obter a Tabela do site e colocar por exemplo em um "DataSet", "DataTable" ou Gerar direto o arquivo TXT?

     Exemplo Na Tabela

    Código  Ação

    ALL3     ALL AMER LAT

    Para o arquivo

    Código;Ação

    ALL3;ALL AMER LAT;

    Obrigado!
    • Editado Vitor Veloso quinta-feira, 10 de novembro de 2011 14:10
    quinta-feira, 10 de novembro de 2011 14:05

Respostas

  • Vitor veja este código, para conseguir ler o HTML usei um componente chamado HtmlAgilityPack, segue o link abaixo:
    http://htmlagilitypack.codeplex.com/

     
    Código funcionando:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Net;
    using System.IO;
    using System.Xml.Linq;
    using System.Text;
    using HtmlAgilityPack;
    using System.Data;
    using System.Text.RegularExpressions;
    
    namespace WebApplication8
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
                string html = DownloadWebPage("http://www.bmfbovespa.com.br/indices/ResumoCarteiraTeorica.aspx?Indice=IBOVESPA&idioma=pt-br");
    
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);
    
                var header = (from table in doc.DocumentNode.SelectNodes("//thead").Cast<HtmlNode>()
                              from row in table.SelectNodes("tr").Cast<HtmlNode>()
                              from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                              select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                var body = (from table in doc.DocumentNode.SelectNodes("//tbody").Cast<HtmlNode>()
                            from row in table.SelectNodes("tr").Cast<HtmlNode>()
                            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                            select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                var foot = (from table in doc.DocumentNode.SelectNodes("//tfoot").Cast<HtmlNode>()
                            from row in table.SelectNodes("tr").Cast<HtmlNode>()
                            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                            select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                DataTable dt = new DataTable();
    
                int indexHeader = header.Count() / 5;
                int index = 0;
    
                if (indexHeader == 1)
                {
                    dt.Columns.Add(header[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
    
    
                    int indexBody = body.Count() / 5;
                    index = 0;
                    //Body
                    for (int i = 0; i < indexBody; i++)
                    {
                        //Regex.Replace(".*(w*).*", "\1", "");
    
                        if (index == 0)
                        {
                            dt.Rows.Add
                            (
                            body[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[4 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 4;
                        }
                        else
                        {
                            dt.Rows.Add
                            (
                            body[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[5 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 5;
                        }
                    }
    
                    int indexFoot = foot.Count() / 5;
                    index = 0;
                    //Foot
                    for (int i = 0; i < indexFoot; i++)
                    {
                        if (index == 0)
                        {
                            dt.Rows.Add
                            (
                            foot[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[4 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 4;
                        }
                        else
                        {
                            dt.Rows.Add
                            (
                            foot[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[5 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 5;
                        }
                    }
                }
    
            }
    
            public string DownloadWebPage(string Url)
            {
                // Open a connection
                HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create(Url);
    
                // You can also specify additional header values like 
                // the user agent or the referer:
                //WebRequestObject.UserAgent = ".NET Framework/2.0";
                //WebRequestObject.Referer = "http://www.example.com/";
    
                // Request response:
                WebResponse Response = WebRequestObject.GetResponse();
    
                // Open data stream:
                Stream WebStream = Response.GetResponseStream();
    
                // Create reader object:
                StreamReader Reader = new StreamReader(WebStream);
    
                // Read the entire stream content:
                string PageContent = Reader.ReadToEnd();
    
                // Cleanup
                Reader.Close();
                WebStream.Close();
                Response.Close();
    
                return PageContent;
            }
        }
    }
    
    

     Resultado:
     

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Editado Vitor Mendes quinta-feira, 10 de novembro de 2011 18:50
    • Marcado como Resposta Vitor Veloso quinta-feira, 10 de novembro de 2011 19:32
    quinta-feira, 10 de novembro de 2011 18:50

Todas as Respostas

  • Fala Vitor,

    Não sei se entendi muito bem.

    Voce quer fazer isso de forma manual ou programando!

    Se for Manual:

    Basta selecionar a tabela da página, ctrl+c e colar no excel ou no notepad.. Vem tudo certitnho

    Se for programando.

    Como você já conseguiu recuperar o html, basta você navegar dentro do html procurando a table. O site só contem uma table (acabei de olhar o html). Assim que encontrar a table, basta recuperar os valores.

    OK?

     


    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com
    quinta-feira, 10 de novembro de 2011 15:06
  • Opa Francisco,

    Quero recuperar estes valores programando mesmo!

    Teria algum exemplo de como recuperar estes valores dentro da table?

    Lembrando que os valores estão em <Tag> dentro da Table...

    Obrigado


    Vitor Veloso Systems Programmer Application Services vsveloso@msn.com www.facebook.com/vsveloso www.vsveloso.com.br
    quinta-feira, 10 de novembro de 2011 16:56
  • Vitor,

    Você pode utilizar o método Find(), dentro da classe string.

    Depois de achar a parte que você quer, vocÇe pode utilizar o método Substring() da própria classe string também, dentro do próprio intelicensse, tem a documentação destes métodos e o que é necessário.


    Odair Ferreira
    quinta-feira, 10 de novembro de 2011 17:10
  • Fala Vitor,

    Este processo será bem manual.

    Exemplo:

    string teste = "aqui vai o html";
    int inicio = teste.IndexOf("<table ");
    int fim = teste.IndexOf("</table>", inicio);
    string table = teste.Substring(inicio, inicio + fim);
    


    Neste código eu demonstro como recuperar a table inteira e colocar dentro da string table.

    Depois você deverá continuar este processo, ao invés de table, usando <tr>, <td>. Até que sobre somento o valor.

    Aí vai para a próxima linha.

    Para facilitar sua vida nesta segunda etapa, pode fazer uso de for e foreach.

    OK?


    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com
    quinta-feira, 10 de novembro de 2011 17:12
  • Vitor veja este código, para conseguir ler o HTML usei um componente chamado HtmlAgilityPack, segue o link abaixo:
    http://htmlagilitypack.codeplex.com/

     
    Código funcionando:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Net;
    using System.IO;
    using System.Xml.Linq;
    using System.Text;
    using HtmlAgilityPack;
    using System.Data;
    using System.Text.RegularExpressions;
    
    namespace WebApplication8
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
    
                string html = DownloadWebPage("http://www.bmfbovespa.com.br/indices/ResumoCarteiraTeorica.aspx?Indice=IBOVESPA&idioma=pt-br");
    
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);
    
                var header = (from table in doc.DocumentNode.SelectNodes("//thead").Cast<HtmlNode>()
                              from row in table.SelectNodes("tr").Cast<HtmlNode>()
                              from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                              select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                var body = (from table in doc.DocumentNode.SelectNodes("//tbody").Cast<HtmlNode>()
                            from row in table.SelectNodes("tr").Cast<HtmlNode>()
                            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                            select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                var foot = (from table in doc.DocumentNode.SelectNodes("//tfoot").Cast<HtmlNode>()
                            from row in table.SelectNodes("tr").Cast<HtmlNode>()
                            from cell in row.SelectNodes("th|td").Cast<HtmlNode>()
                            select new { Table = table.Id, CellText = cell.InnerText }).ToList();
    
                DataTable dt = new DataTable();
    
                int indexHeader = header.Count() / 5;
                int index = 0;
    
                if (indexHeader == 1)
                {
                    dt.Columns.Add(header[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
                    dt.Columns.Add(header[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""));
    
    
                    int indexBody = body.Count() / 5;
                    index = 0;
                    //Body
                    for (int i = 0; i < indexBody; i++)
                    {
                        //Regex.Replace(".*(w*).*", "\1", "");
    
                        if (index == 0)
                        {
                            dt.Rows.Add
                            (
                            body[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[4 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 4;
                        }
                        else
                        {
                            dt.Rows.Add
                            (
                            body[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            body[5 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 5;
                        }
                    }
    
                    int indexFoot = foot.Count() / 5;
                    index = 0;
                    //Foot
                    for (int i = 0; i < indexFoot; i++)
                    {
                        if (index == 0)
                        {
                            dt.Rows.Add
                            (
                            foot[0 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[4 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 4;
                        }
                        else
                        {
                            dt.Rows.Add
                            (
                            foot[1 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[2 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[3 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[4 + index].CellText.ToString().Trim().Replace("&nbsp;", ""),
                            foot[5 + index].CellText.ToString().Trim().Replace("&nbsp;", "")
                            );
                            index += 5;
                        }
                    }
                }
    
            }
    
            public string DownloadWebPage(string Url)
            {
                // Open a connection
                HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create(Url);
    
                // You can also specify additional header values like 
                // the user agent or the referer:
                //WebRequestObject.UserAgent = ".NET Framework/2.0";
                //WebRequestObject.Referer = "http://www.example.com/";
    
                // Request response:
                WebResponse Response = WebRequestObject.GetResponse();
    
                // Open data stream:
                Stream WebStream = Response.GetResponseStream();
    
                // Create reader object:
                StreamReader Reader = new StreamReader(WebStream);
    
                // Read the entire stream content:
                string PageContent = Reader.ReadToEnd();
    
                // Cleanup
                Reader.Close();
                WebStream.Close();
                Response.Close();
    
                return PageContent;
            }
        }
    }
    
    

     Resultado:
     

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    • Editado Vitor Mendes quinta-feira, 10 de novembro de 2011 18:50
    • Marcado como Resposta Vitor Veloso quinta-feira, 10 de novembro de 2011 19:32
    quinta-feira, 10 de novembro de 2011 18:50
  • Fala Vitor,

    Depois de muita pesquisa, também consegui utlizando este componente...

    Ai vai como utilizei!!!

    // Stancia as referencias do HtmlAgilityParck
                HtmlAgilityPack.HtmlWeb web = new HtmlWeb();
                HtmlAgilityPack.HtmlDocument doc = web.Load("http://www.bmfbovespa.com.br/indices/ResumoCarteiraTeorica.aspx?Indice=IBOVESPA&idioma=pt-br");
    
                // Nome dos Controles
                String strTabela = "ctl00_contentPlaceHolderConteudo_grdResumoCarteiraTeorica";
                String strControle = "ctl01";
                List<String> strCampo = new List<String>();
                String strXPath;
                String strValue;
    
                //Nome dos Campos
                strCampo.Add("lblCodigo");
                strCampo.Add("lblAcao");
                strCampo.Add("lblTipo");
                strCampo.Add("lblQtdeTeorica_Formatada");
                strCampo.Add("lblPart_Formatada");
    
                // Cria e abre arquivo no caminho informado
                StreamWriter swrArquivo = new StreamWriter(@"C:\Temp\Página.txt");
    
                // Monta o cabeçalho
                strValue = "Código;Ação;Tipo;Qtde. Teórica;Part. (%)";
                swrArquivo.WriteLine(strValue);
    
                // Preenche os valores dos campos
                // Percorre as linhas
                for (int row = 0; row < 500; row++)
                {
                    try
                    {
                        strValue = "";
                        
                        // Percorre as colunas
                        for (int col = 0; col < strCampo.Count; col++)
                        {
                            // Monta a string do caminho de consulta
                            strXPath = strTabela + "_" + strControle + "_" + "ctl" + row.ToString("00") + "_" + strCampo[col];
                            strXPath = doc.GetElementbyId(strXPath).XPath;
    
                            // Obtem valor do campo
                            foreach (HtmlNode link in doc.DocumentNode.SelectNodes(strXPath))
                            {strValue += link.InnerText.Trim() + ";";}
                        }
    
                        // Salva linha no arquivo
                        swrArquivo.WriteLine(strValue);
                    }
                    catch (Exception) { }
                }
                
                // Finaliza o arquivo após preenchido
                swrArquivo.Close();
    


    Valeu Pessoal,

    Muito obrigado pelo apoio


    Vitor Veloso Systems Programmer Application Services vsveloso@msn.com www.facebook.com/vsveloso www.vsveloso.com.br
    quinta-feira, 10 de novembro de 2011 19:35
  • Francisco,

    A melhor solução que achei, foi a do Vitor Mendes!!!!

    Já fiz os teste e postei o código de como estou fazendo. Está gerando normalmente o arquivo.

    Cara, Muito obrigado pelo apoio


    Vitor Veloso Systems Programmer Application Services vsveloso@msn.com www.facebook.com/vsveloso www.vsveloso.com.br
    quinta-feira, 10 de novembro de 2011 19:39
  • Francisco,

    A melhor solução que achei, foi a do Vitor Mendes!!!!

    Já fiz os teste e postei o código de como estou fazendo. Está gerando normalmente o arquivo.

    Cara, Muito obrigado pelo apoio


    Vitor Veloso Systems Programmer Application Services vsveloso@msn.com www.facebook.com/vsveloso www.vsveloso.com.br
    Magina Vitor, um colega aqui do serviço que deu a dica, é sempre bom poder ajudar e deixar registrado para futuras consultas.
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    quinta-feira, 10 de novembro de 2011 19:49
  • isso ai..
    Francisco Gonçalves
    Blog: franciscogoncalves.wordpress.com
    quinta-feira, 10 de novembro de 2011 22:02