HtmlAgilityPack SelectNodes, Disposing

c# html-agility-pack web-scraping

Domanda

Sto cercando di fare un po 'di screen scraping usando HtmlAgilityPack usando SelectNodes e ottenendo alcuni valori da ogni nodo restituito

Ecco il codice

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]");
    }
}

Ma ho notato che quando si tenta di selezionare i bambini con all'interno del ciclo foreach, in realtà cerca dalla radice del documento. Qualcosa che è davvero fastidioso.

Domande:

  1. C'è un modo per selezionare i valori da ciascuna tabella restituita da SelectNodes senza dover creare una nuova istanza di documento da HtmlDocument ?

  2. C'è un modo per disporre di HtmlDocument , perché ho notato che c'è una perdita di memoria ogni volta che uso _document.LoadHtml(html) ;

Risposta popolare

(per una spiegazione più dettagliata, vedere Html Agility Pack - Problema di selezione del nodo secondario )


Non è necessario creare un altro oggetto HtmlDocument o caricarne un altro HTML. Devi solo fare:

foreach (var table in tables)
{
    var value = table.SelectSingleNode(".//tbody[1]/tr/td[0]");
}

La chiave è usare .//tbody invece di //tbody .



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché