Web scraping com o Html Agility Pack

Se precisam de ir buscar conteúdo programaticamente a um website podem usar o Html Agility Pack, que é um parser de HTML que lê/escreve DOM e suporta XPATH. Neste artigo fazemos-lhe uma introdução.

Instalar o Html Agility Pack

Primeiro instalem o parser. Podem fazê-lo através do NuGet.

Instalar o Html Agility Pack através do NuGet
Instalar o Html Agility Pack através do NuGet

Como usar o Html Agility Pack

De seguida alguns exemplos com os conceitos gerais.

Abrir um documento HTML a partir de um URL:

HtmlWeb web = new HtmlWeb();
HtmlDocument html = web.Load(url);

Ir buscar todas as linhas de tabelas em todo o documento:

var rows = html.DocumentNode.SelectNodes("//table//tr");

Ir buscar todas as células de cada linha (reparem no ponto no início da expressão - significa que vai apenas pesquisar no contexto do nodo):

if (rows != null && rows.Count > 0)
{
    foreach (var row in rows)
    {
        var cells = row.SelectNodes(".//td");
    }
}

Ir buscar o texto interno de uma célula:

var title = cells[0].InnerText;

Ir buscar apenas um nodo:

var link = cells[1].SelectSingleNode(".//a");

Ir buscar um atributo de um nodo (neste caso o destino do link):

if (link != null)
{
    var href = link.GetAttributeValue("href", string.Empty);
}

Ir buscar uma div por ID:

var div = html.DocumentNode.SelectSingleNode("//div[@id='myid']");

Ir buscar uma div com uma classe específica:

var div = html.DocumentNode.SelectNodes("//div[@class='myclass']");

Ir buscar uma div que contém uma classe:

var div = html.DocumentNode.SelectNodes("//div[contains(@class, 'content')]");

Ir buscar uma div que não tem uma classe específica:

var div = html.DocumentNode.SelectNodes("//div[not(@class='hidden')]");

Ir buscar todos os links de uma div específica:

var links = html.DocumentNode.SelectNodes("//div[@id='main']//a");

Ir buscar o último link de uma div específica:

var lastLink = html.DocumentNode.SelectSingleNode("//div[@id='main']//a[last()]");

Ir buscar a segunda tabela no documento:

var table = html.DocumentNode.SelectSingleNode("//table[2]");

Ir buscar uma tabela com uma classe específica e um texto específico no cabeçalho.

var main = html.DocumentNode.SelectSingleNode("//table[contains(@class, 'standings') and .//th//text()[contains(., 'Full Table')]]");
Nuno Freitas
Publicado por Nuno Freitas em 02 maio, 2014

Artigos relacionados