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:
¿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
?
¿Hay alguna manera de eliminar HtmlDocument
, porque noté que hay una pérdida de memoria cada vez que uso _document.LoadHtml(html)
;
(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
.