2

我正在尝试使用 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)

4

1 回答 1

1

(有关更详细的说明,请参阅Html Agility Pack - 选择子节点时出现问题


不必创建另一个HtmlDocument对象,或将另一个 HTML 加载到其中。你只需要做:

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

关键是使用.//tbody而不是//tbody.

于 2013-02-24T03:51:59.740 回答