2013-02-23 68 views
2

我试图用HtmlAgilityPack使用SelectNodes并从每个节点得到一些价值做一些屏幕抓取返回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

(对于更详细的解释,见Html Agility Pack - Problem selecting subnode


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

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

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

+0

那么如何处置HtmlDocument? – 2013-02-24 15:19:31

+0

另外我得到这个错误,如果我没有创建一个新的HtmlDocument实例。 startIndex不能大于字符串的长度。 – 2013-02-24 15:46:04

+0

我只是回答你的第一个问题。 – 2013-02-25 07:08:16