Pack d’agilité HTML – tables d’parsing

Je veux utiliser le pack d’agilité HTML pour parsingr les tableaux de pages Web complexes, mais je suis en quelque sorte perdu dans le modèle d’object.

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 pratiquement perdu après avoir chargé les données sur la façon d’obtenir les tables. Je l’ai fait auparavant en Perl et c’était un peu maladroit, mais a fonctionné. ( HTML::TableParser ).

Je suis également heureux si l’on peut juste jeter un coup d’oeil sur le bon ordre d’object pour l’parsing.

Que diriez-vous de quelque chose comme: Utilisation de HTML Agility Pack

 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"

hello
world

"); 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 le souhaitez:

 var query = from table in doc.DocumentNode.SelectNodes("//table").Cast() from row in table.SelectNodes("tr").Cast() from cell in row.SelectNodes("th|td").Cast() select new {Table = table.Id, CellText = cell.InnerText}; foreach(var cell in query) { Console.WriteLine("{0}: {1}", cell.Table, cell.CellText); } 

Le plus simple que j’ai trouvé pour obtenir le XPath pour un élément particulier est d’installer l’extension FireBug pour Firefox, allez sur le site / la page Web, appuyez sur F12 pour faire apparaître Firebug; sélectionnez à droite et cliquez avec le bouton droit sur l’élément sur la page que vous souhaitez interroger et sélectionnez “Inspecter l’élément” Firebug sélectionnera l’élément dans son IDE puis cliquez avec le bouton droit sur Elément dans Firebug et choisissez “Copier XPath” Requête dont vous avez besoin pour obtenir l’élément souhaité à l’aide de la bibliothèque d’agilité HTML.

La ligne ci-dessus répond:

 HtmlDocument doc = new HtmlDocument(); 

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

Une autre “fonctionnalité” MS qui rend les choses plus difficiles à utiliser. Essayez HtmlAgilityPack.HtmlWeb et consultez ce lien pour un exemple de code.

Dans mon cas, il existe une seule table qui se trouve être une liste de périphériques d’un routeur. Si vous souhaitez lire la table en utilisant TR / TH / TD (ligne, en-tête, données) au lieu d’une masortingce comme mentionné ci-dessus, vous pouvez faire quelque chose comme ceci:

  List 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 simplement un object simple avec en-tête et données en tant que propriétés. L’approche prend en compte la nullité et ce cas: