HtmlAgilityPack SelectNodes, Disposing

c# html-agility-pack web-scraping

Frage

Ich versuche mit HtmlAgilityPack mithilfe von SelectNodes Screen Scraping SelectNodes und einige Werte von jedem Knoten zurückzugeben

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

Aber ich habe festgestellt, dass beim Suchen von Kindern innerhalb der foreach-Schleife tatsächlich von der Dokumentwurzel aus gesucht wird. Etwas, das wirklich nervt.

Fragen:

  1. Gibt es eine Möglichkeit, die Werte aus jeder von SelectNodes Tabelle SelectNodes ohne eine neue Dokumentinstanz aus dem HtmlDocument erstellen zu HtmlDocument ?

  2. Gibt es eine Möglichkeit, HtmlDocument zu disponieren, weil ich jedes Mal, wenn ich _document.LoadHtml(html) , ein Speicherleck _document.LoadHtml(html) ;

Beliebte Antwort

(Für eine detailliertere Erklärung siehe Html Agility Pack - Problem beim Auswählen des Unterknotens )


Sie müssen kein anderes HtmlDocument Objekt erstellen oder einen anderen HTML- HtmlDocument laden. Sie müssen nur tun:

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

Der Schlüssel ist die Verwendung von .//tbody anstelle von //tbody .



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum