2009-03-17 6 views
45

Je veux utiliser le pack d'agilité HTML pour analyser les tables à partir de pages Web complexes, mais je suis en quelque sorte perdu dans le modèle objet.HTML Agility pack - analyse des tables

J'ai regardé l'exemple de lien, mais je n'ai trouvé aucune donnée de table de cette façon. Puis-je utiliser XPath pour obtenir les tables? Je suis fondamentalement perdu après avoir chargé les données sur la façon d'obtenir les tables. J'ai déjà fait ça en Perl et c'était un peu maladroit, mais ça a marché. (HTML::TableParser).

Je suis également heureux si l'on peut juste faire la lumière sur l'ordre de l'objet juste pour l'analyse.

Répondre

96

Que diriez-vous quelque chose comme: En utilisant HTML Agility Pack

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>"); 
foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) { 
    Console.WriteLine("Found: " + table.Id); 
    foreach (HtmlNode row in table.SelectNodes("tr")) { 
     Console.WriteLine("row"); 
     foreach (HtmlNode cell in row.SelectNodes("th|td")) { 
      Console.WriteLine("cell: " + cell.InnerText); 
     } 
    } 
} 

Notez que vous pouvez le faire plus joli avec LINQ-to-objets si vous voulez:

var query = from table in doc.DocumentNode.SelectNodes("//table").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}; 

foreach(var cell in query) { 
    Console.WriteLine("{0}: {1}", cell.Table, cell.CellText); 
} 
+1

Salut Mark, pouvez-vous s'il vous plaît des conseils sur l'analyse des fichiers volumineux? Plus de 50 fichiers mb, je ne peux pas chercher les enfants tr nœuds –

+0

@Marc - si la table est en train de paginer, alors comment aller à la page suivante en grattant? –

+0

@Dark_Knight vous devez appuyer sur n'importe quelle route ajax utilisée sur la page originale –

31

Le plus simple, ce que j'ai trouvé pour obtenir le XPath pour un élément particulier est d'installer l'extension FireBug pour Firefox aller sur le site/page Web appuyez sur F12 pour faire apparaître firebug; droite sélectionnez et cliquez droit sur l'élément sur la page que vous souhaitez interroger et sélectionnez "Inspecter élément" Firebug va sélectionner l'élément dans son IDE puis faites un clic droit sur l'élément dans Firebug et choisissez "Copier XPath" cette fonction vous donnera le exact XPath Requête vous devez obtenir l'élément que vous souhaitez en utilisant HTML Agility Library.

+3

Gardez à l'esprit que, parfois, le navigateur va modifier légèrement le DOM du HTML - comme ajouter à un

s'il est manquant. Par défaut, le Pack Html Agility n'inclut pas les balises et