HTML Agility pack - analyse des tableaux

je veux utiliser le pack D'agilité HTML pour analyser des tables à partir de pages web complexes, mais je suis en quelque sorte perdu dans le modèle objet.

j'ai regardé l'exemple de lien, mais n'ai pas trouvé de données 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 à Perl et c'était un peu maladroit, mais ça a marché. ( HTML::TableParser ).

je suis aussi heureux si on peut juste jeter un lumière sur l'ordre de l'objet juste pour l'analyse.

48
demandé sur Nathaniel Ford 2009-03-17 22:00:18

4 réponses

Que Diriez - vous de quelque chose comme: En utilisant Pack D'agilité HTML

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 rendre plus joli avec LINQ-to-Objects 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);
}
104
répondu Marc Gravell 2017-11-28 17:52:37

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 mettre en place firebug; droite sélectionner et droit cliquer l'élément sur la page que vous voulez interroger et sélectionner "inspecter L'élément" Firebug sélectionnera l'élément dans son IDE puis droit cliquer L'élément dans Firebug et choisir "Copier XPath" cette fonction vous donnera la requête XPath exacte dont vous avez besoin pour obtenir l'élément que vous voulez utiliser HTML Bibliothèque D'Agilité.

31
répondu Coda 2010-06-23 17:33:23

ligne de la réponse ci-dessus:

HtmlDocument doc = new HtmlDocument();

cela ne fonctionne pas dans VS 2015 C#. Vous ne pouvez plus construire un HtmlDocument .

un Autre MS "fonctionnalité" qui rend les choses plus difficiles à utiliser. Essayez HtmlAgilityPack.HtmlWeb et cochez ce lien pour un exemple de code.

0
répondu rk42 2016-01-13 02:37:14

dans mon cas, il y a une table unique qui se trouve être une liste de périphériques à partir d'un routeur. Si vous souhaitez lire le tableau en utilisant TR / TH / TD (ligne, en-tête, données) au lieu d'une matrice comme mentionné ci-dessus, vous pouvez faire quelque chose comme le suivant:

    List<TableRow> deviceTable = (from table in document.DocumentNode.SelectNodes(XPathQueries.SELECT_TABLE)
                                       from row in table?.SelectNodes(HtmlBody.TR)
                                       let rows = row.SelectSingleNode(HtmlBody.TR)
                                       where row.FirstChild.OriginalName != null && row.FirstChild.OriginalName.Equals(HtmlBody.T_HEADER)
                                       select new TableRow
                                       {
                                           Header = row.SelectSingleNode(HtmlBody.T_HEADER)?.InnerText,
                                           Data = row.SelectSingleNode(HtmlBody.T_DATA)?.InnerText}).ToList();
                                       }  

TableRow est juste un objet simple avec en-tête et données comme propriétés. L'approche s'occupe de la nullité et de ce cas:

<tr>
    <td width="28%">&nbsp;</td>
</tr>

qui est ligne sans en-tête. L'objet HtmlBody avec les constantes pendantes de lui sont probablement facilement déduits mais je m'en excuse pour lui même encore. Je suis venu du monde où, si vous avez dans votre code, il devrait être constante ou localisable.

0
répondu Shibumi Tait 2017-05-05 03:51:22