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.
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')]]");