用于捕获交替行的 XPath
XPath to Capture Alternating Rows
使用 HtmlAgilityPack
,我试图捕获行 class 名称交替出现的 table 行。下面的片段:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var documentNode = doc.DocumentNode;
var lstNodes = documentNode.SelectNodes("//table[@class='rgMasterTable']");
var tableNode = lstNodes[0];
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'|@class='rgAltRow dnnGridAltItem']");
在最后一行,我试图说“给我 class 是 rgRow dnnGridItem
或 rgAltRow dnnGridAltItem
的行。但是,我得到以下异常:
Exception thrown: 'System.Xml.XPath.XPathException' in System.Xml.dll
Additional information: Expression must evaluate to a node-set.
HTML 的来源可在此处获得:http://www.terna.it/it-it/sistemaelettrico/remit.aspx
非常感谢任何有关正确 XPath 查询的帮助。
感谢来自@LukášDoležal 的link:Select on multiple criteria with XPath
UNION 应该在节点上,而不是在 class 规范上。
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'|@class='rgAltRow dnnGridAltItem']");
变成
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'] | //tr[@class='rgAltRow dnnGridAltItem']");
或更短(感谢@splash58):
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem' or @class='rgAltRow dnnGridAltItem']");
使用 HtmlAgilityPack
,我试图捕获行 class 名称交替出现的 table 行。下面的片段:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var documentNode = doc.DocumentNode;
var lstNodes = documentNode.SelectNodes("//table[@class='rgMasterTable']");
var tableNode = lstNodes[0];
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'|@class='rgAltRow dnnGridAltItem']");
在最后一行,我试图说“给我 class 是 rgRow dnnGridItem
或 rgAltRow dnnGridAltItem
的行。但是,我得到以下异常:
Exception thrown: 'System.Xml.XPath.XPathException' in System.Xml.dll
Additional information: Expression must evaluate to a node-set.
HTML 的来源可在此处获得:http://www.terna.it/it-it/sistemaelettrico/remit.aspx
非常感谢任何有关正确 XPath 查询的帮助。
感谢来自@LukášDoležal 的link:Select on multiple criteria with XPath
UNION 应该在节点上,而不是在 class 规范上。
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'|@class='rgAltRow dnnGridAltItem']");
变成
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem'] | //tr[@class='rgAltRow dnnGridAltItem']");
或更短(感谢@splash58):
var rows = tableNode.SelectNodes("//tr[@class='rgRow dnnGridItem' or @class='rgAltRow dnnGridAltItem']");