我正在尝试使用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循环内部选择子项时,它实际上是从文档根目录中搜索的。一些非常烦人的东西。
问题:
有没有办法从SelectNodes
返回的每个表中选择值,而无需从HtmlDocument
创建新的文档实例?
有没有办法处置HtmlDocument
,因为我注意到每次使用_document.LoadHtml(html)
时都会发生内存泄漏;
答案 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
。