J'essaie de faire un peu d'écran en utilisant HtmlAgilityPack en utilisant SelectNodes
et en récupérant des valeurs de chaque noeud
Voici le code
private readonly HtmlDocument _document = new HtmlDocument();
public void ParseValues(string html)
{
_document.LoadHtml(html);
var tables = _document.DocumentNode.SelectNodes("//table");
foreach (var table in tables)
{
_document.LoadHtml(table.OuterHtml);
var value = _document.DocumentNode.SelectSingleNode("//tbody[1]/tr/td[0]");
}
}
Mais j’ai remarqué que lorsque vous essayez de sélectionner des enfants avec une boucle foreach interne, ils effectuent une recherche à partir de la racine du document. Quelque chose qui est vraiment ennuyeux.
Des questions:
Existe-t-il un moyen de sélectionner les valeurs de chaque table renvoyées par SelectNodes
sans avoir à créer une nouvelle instance de document à partir de HtmlDocument
?
Existe-t-il un moyen de disposer de HtmlDocument
, car j'ai remarqué qu'il y avait une fuite de mémoire chaque fois que j'utilisais _document.LoadHtml(html)
;
(pour une explication plus détaillée, voir Pack d'agilité HTML - Problème de sélection du sous-noeud )
Vous n'avez pas à créer un autre objet HtmlDocument
, ni à charger un autre HTML dans celui-ci. Vous devez juste faire:
foreach (var table in tables)
{
var value = table.SelectSingleNode(".//tbody[1]/tr/td[0]");
}
La clé consiste à utiliser .//tbody
au lieu de //tbody
.