none
Ler pagina HTML em C# RRS feed

  • Pergunta

  • Bom dia pessoal, eis-me aqui novamente com mais um pepino da faculdade. Espero que me ajudem assim como tem acontecido. Bem estou amarrotado de trabalhos de programação o mais recente necessito criar um sistema que receba com parâmetro uma URL e faça algumas operações. Preciso implementar uma classe PaginaWeb com métodos para recuperar texto e links existentes em uma página Web. Segue a descrição:

     

    1. Criar classe PaginaWeb e os seguintes métodos:

    • a. Construtor sem parâmetros.
    • b. Construtor PaginaWeb( string URL ): que inicializa objeto e busca página cujo endereço é passado como parâmetro (chamar método CarregarPagina).
    • c. Bool  CarregarPagina( string URL ): busca  página  cujo endereço é passado como parâmetro. Retorna verdadeiro se conseguir encontrar página e falso caso contrário. Também inicializa as áreas de texto e a lista de links que a página contém. 
    • d. String ObterTextoPagina(): retorna texto da página Web, sem os links.
    • e. String[]  ObterListaLinks(): retorna uma lista de links com endereços  URL de todas as páginas apontadas (todos os métodos acima são métodos de objetos)
    • f. String ObterHTMLPagina (): retorna HTML da página Web, incluindo os links e o texto. 

    2. Testes

    • a. Implementar menu de usuário para executar os métodos da classe acima
    • i. Carregar página (CarregarPagina)
    • ii. Mostrar texto (ObterTextoPagina) 
    • iii. Mostrar lista de links URL (ObterListaLinks)
    • iv. Mostrar página completa (ObterHTMLPagina)

    Ou seja, estou ferrado!!!. O problema é que não sei nem por onde começar. Gostaria da ajuda de vocês. Podem me ajudar???

    Grato pela atenção


    Cursando 3º período de Sistemas de Informação pela Pontifícia Universidade Católica de Minas Gerais - PUCMG
    terça-feira, 5 de abril de 2011 12:25

Respostas

  • Bom dia amigo, recentemente crie um projeto em C# bem parecido com isso que você precisa, no meu caso eu crie uma aplicação em console que visitava uma série de páginas Web e coletava os dados determinadas regiões das páginas gravando o resultado no banco para que fossem consumidos por uma página web que crie posteriormente.

    Imagine por exemplo um situação onde você queira visitar um site de compras todos os dias e verificar o preço de um determinado produto, bastaria criar um código que carregasse esta página diariamente, percorre-se o html até encontrar o elemento onde o preço se encontra e gravasse esse valor num banco, um xml, ou enviasse para seu celular. bacana né?

    O problema: No meu caso eu não percorria o html completamente o que eu fazia era acessar diretamente o elemento html através do seu XPath(XML Path Language). Se por algum motivo o html da página mudasse o xpath mudaria e eu teria que alterar o xpath no meu código. Mas como as páginas normalmente não sofrem muitas alterações em curtos períodos de tempo não chegou a ser uma dor de cabeça.

    Enfim, como eu fiz: baixei a biblioteca em .Net "HtmlAgilityPack" que me permitiu fazer isso tudo.Veja um trecho de código de como acessar uma página, ir até o xpath(//div[@id='dvTitulo']/h1[@class='titdestaque']) de um elemento h1 dentro de um div e retornar seu innertext:

     

    HtmlDocument doc;
    string titulo;
    
    public void pesquisarTitulo()
    {
    
     using (WebClient client = new WebClient())
     {
     string html = client.DownloadString("http://www.codeplex.com");
     doc.LoadHtml(html);
     }
    
     //Titulo
     HtmlNode no = doc.DocumentNode.SelectSingleNode("//div[@id='dvTitulo']/h1[@class='titdestaque']");
     titulo = no.InnerText;
    
    }
    

     

    Para capturar o xpath de elementos em uma página web existem extensões de browsers que fazem isso e as próprias ferramentas de inspeção de código nativa dos browsers conseguem te mostrar isso.

    Se preferir posso compartilhar um aplicação bem simples que carregue algum dados de um determinado site.

    Dúvidas?? Qualquer coisa é só perguntar. 

    Marque como respondido por favor caso tenha sido útil. :)

    Abraços



    terça-feira, 5 de abril de 2011 15:00
  • LB_SI_2001,

    Confira estas Threads que tratam sobre este assunto.

    Para obter a página HTML:

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/47299601-5bad-4a82-b7ed-f2da0c1fa8ea/

    Para extrair os links, veja este exemplo que extrai os TDs e TRs:

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/7d54814e-9fb2-489d-905f-002758f1b3b7/

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    • Marcado como Resposta L.B.O - SI 2013 quarta-feira, 6 de abril de 2011 22:18
    terça-feira, 5 de abril de 2011 12:49

Todas as Respostas

  • LB_SI_2001,

    Confira estas Threads que tratam sobre este assunto.

    Para obter a página HTML:

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/47299601-5bad-4a82-b7ed-f2da0c1fa8ea/

    Para extrair os links, veja este exemplo que extrai os TDs e TRs:

    http://social.msdn.microsoft.com/Forums/pt-BR/vsvbasicpt/thread/7d54814e-9fb2-489d-905f-002758f1b3b7/

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    • Marcado como Resposta L.B.O - SI 2013 quarta-feira, 6 de abril de 2011 22:18
    terça-feira, 5 de abril de 2011 12:49
  • Bom dia amigo, recentemente crie um projeto em C# bem parecido com isso que você precisa, no meu caso eu crie uma aplicação em console que visitava uma série de páginas Web e coletava os dados determinadas regiões das páginas gravando o resultado no banco para que fossem consumidos por uma página web que crie posteriormente.

    Imagine por exemplo um situação onde você queira visitar um site de compras todos os dias e verificar o preço de um determinado produto, bastaria criar um código que carregasse esta página diariamente, percorre-se o html até encontrar o elemento onde o preço se encontra e gravasse esse valor num banco, um xml, ou enviasse para seu celular. bacana né?

    O problema: No meu caso eu não percorria o html completamente o que eu fazia era acessar diretamente o elemento html através do seu XPath(XML Path Language). Se por algum motivo o html da página mudasse o xpath mudaria e eu teria que alterar o xpath no meu código. Mas como as páginas normalmente não sofrem muitas alterações em curtos períodos de tempo não chegou a ser uma dor de cabeça.

    Enfim, como eu fiz: baixei a biblioteca em .Net "HtmlAgilityPack" que me permitiu fazer isso tudo.Veja um trecho de código de como acessar uma página, ir até o xpath(//div[@id='dvTitulo']/h1[@class='titdestaque']) de um elemento h1 dentro de um div e retornar seu innertext:

     

    HtmlDocument doc;
    string titulo;
    
    public void pesquisarTitulo()
    {
    
     using (WebClient client = new WebClient())
     {
     string html = client.DownloadString("http://www.codeplex.com");
     doc.LoadHtml(html);
     }
    
     //Titulo
     HtmlNode no = doc.DocumentNode.SelectSingleNode("//div[@id='dvTitulo']/h1[@class='titdestaque']");
     titulo = no.InnerText;
    
    }
    

     

    Para capturar o xpath de elementos em uma página web existem extensões de browsers que fazem isso e as próprias ferramentas de inspeção de código nativa dos browsers conseguem te mostrar isso.

    Se preferir posso compartilhar um aplicação bem simples que carregue algum dados de um determinado site.

    Dúvidas?? Qualquer coisa é só perguntar. 

    Marque como respondido por favor caso tenha sido útil. :)

    Abraços



    terça-feira, 5 de abril de 2011 15:00
  • Boa noite pessoal. Peço desculpas pela demora, mais estou sem net aí ja viu né... Quanto a respostas, agradeço as duas, irei analizar os links, qualquer duvida posto aqui de novo vlw. Marquei as duas como respostas.
    Cursando 3º período de Sistemas de Informação pela Pontifícia Universidade Católica de Minas Gerais - PUCMG
    quarta-feira, 6 de abril de 2011 22:17
  • Pra mim serviu demais Rodrigo, obrigado pela dica.

    Antonio Cardoso S. Júnior - MCP, Partner Network Blog - http://devnetbr.wordpress.com/

    terça-feira, 2 de julho de 2013 18:35
  • Olá Rodrigo, tudo bem!?

    Amigo, estou precisando desenvolver um projeto que se parece muito com o que você descreveu ter desenvolvido. Eu preciso de um sistema que varra alguns sites de notícias e detecte o título, subtitulo, corpo da matéria e data da notícia... E pelo pouco código que você apresentou no exemplo para o amigo que estava precisando de ajuda me pareceu bem aquilo que preciso. Tem como me ajudar compartilhando essa aplicação, por favor...?

    Muito obrigado e um forte abraço.
    terça-feira, 30 de setembro de 2014 15:46
  • Opa tudo ótimo Fabio, e você? Ficarei feliz em ajudar no que eu puder, no entanto eu não garanto que ainda tenha a aplicação que estava fazendo naquela época pois já faz um bom tempo. Foi apenas um teste conceitual e desde então não tenho trabalhado ou criado nada deste tipo, mas prometo que irei fazer uma busca e ver o que consigo para você.

    Mas caso eu não encontre acredito que com as informações acima daria pra criar algo rapidamente que consumisse uma página simples, parece complicado mas é relativamente simples.

    Entro em contato assim que possível. :)

    Abraços


    Rodrigo Reis Ferreira
    Microsoft Certified

    terça-feira, 30 de setembro de 2014 17:58
  • Olá Rodrigo! Tudo bem amigo!
    Blz, muito obrigado pela força. A rotina para "crawlear" e inserir no banco eu já tenho e está funcionando. O que preciso é uma rotina para varrer posteriormente esses dados e achar as tags de título, subtitulo, conteúdo e data por exemplo.

    Abraços,
    terça-feira, 30 de setembro de 2014 18:47
  • Rodrigo...

    também fiquei interessado no seu exemplo...

    Se ainda puder enviar um exemplo mostrando o caminho das pedras, eu ficaria muito satisfeito!!!!

    Obrigado!


    Natan

    quinta-feira, 16 de outubro de 2014 12:24
  • Boa noite   pessoal,

     Aproveitando o contexto tenho uma duvida, 

       dentro deste bloco   de html  abaixo,

        não consigo   extrair o nome  e o valor do produto.

       Usando  desta forma, obtenho só o valor.

      htmlDoc.DocumentNode.SelectNodes("//div[@class='hproduct']/a[@class='link url']/span[@class='productDetails']/span[@class='for price sale']")

     e desta so o nome do produto:

    htmlDoc.DocumentNode.SelectNodes("//div[@class='hproduct']/a[@class='link url']/strong[@class='name fn']" 

    Percebam que o bloco que contem o nome do produto esta  iniciando e fechando de forma independente

    <strong class="name fn">Lavadora Brastemp BWH12AB 12kg – Branca</strong> 

    ou seja,  se analisarem  a TAg  span  não  esta dentro da tag /strong   e por isso não esta dando certo.

    Pergunto aos colegas , realmente não é possível por uma  questão de estrutura ou estou errando !

    Obrigado

     <div class="hproduct">

    <a class="link url" title="Lavadora Brastemp BWH12AB 12kg – Branca"  rel="product"           href="http://www.extra.com.br/Eletrodomesticos/maquinadelavar/Acimade10kg/Lavadora-Brastemp-BWH12AB-12kg-%e2%80%93-Branca-7880937.html?recsource=busca-int&amp;rectype=busca-24">
              <strong class="category">Eletrodomésticos</strong>
    <span class="productImage">
    <img src="http://www.extra-imagens.com.br/App_Themes/Extra/Img/blank.gif" 
        data-src="http://www.extra-imagens.com.br/Eletrodomesticos/maquinadelavar/Acimade10kg/7880937/358542687/Lavadora-Brastemp-BWH12AB-12kg-–-Branca-7880937.jpg" class="lazy" width="292" height="292" alt="Lavadora Brastemp BWH12AB 12kg – Branca" id="358542687" />
    </span>
     <strong class="name fn">Lavadora Brastemp BWH12AB 12kg – Branca</strong> 
    <span class="smallRating">
    <span id="ctl00_Conteudo_ctl02_rating-4474808" class="rating r40">Avaliação dos usuários: 40</span>
    <span class="qtdReviews">(51 Avaliações)</span>
    </span>
    <span class="flags">
    <span class="flagBenefit" onclick="return pop('http://imagens.extra.com.br/html/pops/regras_retira.html', '650', '400', 'Retira Extra');return false; ">
    <img src="http://www.extra-imagens.com.br//App_Themes/Extra/Images/flags/retira_extra_gratis.gif"  alt=">Info: Retira Extra" />
    </span>
    </span> 
    <span class="productDetails">
    <span class="from price regular">De:
       <strong>R$ 1.499,00</strong>
    </span>
    <span class="for price sale">Por: 
    <strong>R$ 1.399,00</strong></span><span class="installment">ou 9X de R$ 155,44<span class="condition"> sem juros</span></span> 
    <span class="PaymentDiscount"><span class="for price discount">R$ 1.329,05</span>
    <span class="DiscountCondition"><i class="DiscountInfo">Mais</i> 5% de desconto</span>
    <i class="DiscountText">em 1x no Cartão ou Boleto. (Exceto para retirada imediata na loja)</i>
    </span></span>

    </a>


    domingo, 27 de novembro de 2016 01:45
  • Ola Antonio, acredito que deveria funcionar sim sem problemas, as sequencias:

    Nome: div > a > strong

    Preço: div > a > span > span

    Pode me mandar o código que carrega o html para eu testar aqui?


    Rodrigo Reis Ferreira
    Microsoft Certified

    segunda-feira, 28 de novembro de 2016 14:29