HtmlAgilityPack SelectNodes,Disposing

时间:2013-02-23 23:31:40

标签: c# web-scraping html-agility-pack

我正在尝试使用HtmlAgilityPack使用SelectNodes进行一些屏幕抓取,并从返回的每个节点获取一些值

这是代码

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

但我注意到,当尝试在foreach循环内部选择子项时,它实际上是从文档根目录中搜索的。一些非常烦人的东西。

问题:

  1. 有没有办法从SelectNodes返回的每个表中选择值,而无需从HtmlDocument创建新的文档实例?

  2. 有没有办法处置HtmlDocument,因为我注意到每次使用_document.LoadHtml(html)时都会发生内存泄漏;

1 个答案:

答案 0 :(得分:1)

(有关更详细的说明,请参阅Html Agility Pack - Problem selecting subnode


必须创建另一个HtmlDocument对象,或者在其中加载另一个HTML。你必须这样做:

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

关键是使用.//tbody代替//tbody