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:
C'è un modo per selezionare i valori da ciascuna tabella restituita da SelectNodes
senza dover creare una nuova istanza di documento da HtmlDocument
?
C'è un modo per disporre di HtmlDocument
, perché ho notato che c'è una perdita di memoria ogni volta che uso _document.LoadHtml(html)
;
(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
.