HtmlAgilityPack SelectNodes, Élimination

c# html-agility-pack web-scraping

Question

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:

  1. 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 ?

  2. 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) ;

Réponse populaire

(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 .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi