HtmlAgilityPack SelectNodes, Disposing

c# html-agility-pack web-scraping

Pregunta

Estoy tratando de hacer un raspado de pantalla usando HtmlAgilityPack usando SelectNodes y obteniendo algunos valores de cada nodo devuelto

Aquí está el código

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

Pero me he dado cuenta de que al intentar seleccionar hijos con el bucle foreach, en realidad se busca desde la raíz del documento. Algo que es realmente molesto.

Preguntas:

  1. ¿Hay una manera de seleccionar los valores de cada tabla devueltos desde SelectNodes sin tener que crear una nueva instancia de documento desde el HtmlDocument ?

  2. ¿Hay alguna manera de eliminar HtmlDocument , porque noté que hay una pérdida de memoria cada vez que uso _document.LoadHtml(html) ;

Respuesta popular

(Para obtener una explicación más detallada, consulte Html Agility Pack - Problema al seleccionar el subnodo )


No es necesario crear otro objeto HtmlDocument o cargar otro HTML en él. Solo tienes que hacer:

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

La clave es usar .//tbody lugar de //tbody .



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué