2013-02-23 47 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