Precisa fazer parsing de HTML em .Net? Experimente o HTML Agility Pack. Com ele você pode facilmente ler uma página HTML e acessar os seus elementos através de expressões XPath, ou então percorrer os nós da estrutura de árvore da página HTML. Vou mostrar aqui um exemplo prático, uma pequena aplicação Windows Forms que, dada uma URL, retorna todos os elementos a (links) existentes na página. Você pode alterar o programa para poder extrair conteúdo de sites, efetuar buscas, etc.
Acesse o site do HTML Agility Pack e faça o download do código fonte. Descompacte, abra o projeto no Visual Studio (2005 ou superior) e compile o projeto HtmlAgilityPack, que deverá gerar a dll com o mesmo nome na pasta bin do projeto. Com a dll criada, feche a solução atual (com o código do HTML Agility Pack) e crie um novo projeto Windows Application usando a linguagem C#. Adicione a referência para a dll do HTML Agility Pack, criada anteriormente. Adicione os seguintes controles no form:
- TextBox, ID "txtUrl", onde será digitada a URL.
- Button, ID "btnBusca", ao clicar esse botão, vai buscar a URL e processar.
- ListBox, ID "lsbResultado", exibir os links encontrados na página.
Agora, vamos para o código:
1: using System;
2: using HtmlAgilityPack;
3: using System.Windows.Forms;
4:
5: namespace PegaLinks
6: {
7: public partial class Form1 : Form
8: {
9: public Form1()
10: {
11: InitializeComponent();
12: }
13:
14: private void btnBusca_Click(object sender, EventArgs e)
15: {
16: try
17: {
18: HtmlWeb web = new HtmlWeb();
19: // O método Load da classe HtmlWeb busca a página HTML e faz o parsing, atribuindo a
20: // árvore do DOM (document object model) gerada ao objeto HtmlDocument
21: HtmlAgilityPack.HtmlDocument doc = web.Load(@txtUrl.Text.Trim());
22:
23: // Aqui pegamos apenas o que interessa, os links (tags <a>), usando XPath
24: HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("/html/body//a");
25: if (nodes != null)
26: {
27: // Percorremos a coleção dos nós encontrados (elementos <a>) e pegamos apenas o
28: // atributo href e o inner text de cada nó.
29: foreach (HtmlNode node in nodes)
30: {
31: HtmlAttribute att = node.Attributes["href"];
32: // Colocamos cada elemento no ListBox
33: lsbResultado.Items.Add(node.InnerText + " (" + att.Value + ")");
34: }
35: }
36: else
37: {
38: MessageBox.Show("Nenhum link encontrado");
39: }
40: }
41: catch (Exception ex)
42: {
43: MessageBox.Show(ex.Message);
44: }
45: }
46: }
47: }
Com poucas linhas você tem o que precisa: a informação limpinha. Sem precisar mexer com complexas expressões regulares ou parsing manual de strings... Tudo rápido e fácil! Não se esqueça de associar o evento Click do botão com o método btnBusca_Click.
d058eed3-8372-43a5-9191-e06c5a9964fe|0|.0