Html 敏捷包 - 选择子节点时出现问题
本文关键字:问题 子节点 选择 Html | 更新日期: 2023-09-27 17:58:04
我想将我的Asics运行计划导出到iCal,由于Asics不提供这项服务,我决定为自己个人使用构建一个小刮刀。我想做的是从我的计划中获取所有计划的运行,并基于此生成iCal提要。我正在使用C#和Html Agility Pack。
我想做的是遍历我所有的计划运行(它们是div 节点(。然后接下来,我想用我的运行节点选择几个不同的节点。我的代码如下所示:
foreach (var run in doc.DocumentNode.SelectSingleNode("//div[@id='scheduleTable']").SelectNodes("//div[@class='pTdBox']"))
{
number++;
string date = run.SelectSingleNode("//div[@class='date']").InnerText;
string type = run.SelectSingleNode("//span[@class='menu']").InnerHtml;
string distance = run.SelectSingleNode("//span[@class='distance']").InnerHtml;
string description = run.SelectSingleNode("//div[@class='description']").InnerHtml;
ViewData["result"] += "Dato: " + date + "<br />";
ViewData["result"] += "Tyep: " + type + "<br />";
ViewData["result"] += "Distance: " + distance + "<br />";
ViewData["result"] += "Description: " + description + "<br />";
ViewData["result"] += run.InnerHtml.Replace("<", "<").Replace(">", ">") + "<br />" + "<br />" + "<br />";
}
我的问题是run.SelectSingleNode("//div[@class='date']").InnerText
没有在给定的运行节点中选择具有给定 XPath 的节点。它选择与整个文档中的 XPath 匹配的第一个节点。
如何在当前节点中选择具有给定 XPath 的单个节点?
谢谢。
更新
我尝试将我的 XPath 字符串更新为:
string date = run.SelectSingleNode(".div[@class='date']").InnerText;
这应该选择当前节点中的<div class="date"></div>
元素,对吗?好吧,我试过这个,但得到这个错误:
表达式的计算结果必须为 节点集。描述:未处理 在 执行当前 Web 请求。 请查看堆栈跟踪以获取更多信息 有关错误和位置的信息 它起源于代码。
异常详情: System.Xml.XPath.XPathException: 表达式的计算结果必须为 节点集。
有什么建议吗?
在使用 HtmlAgilityPack 和 XPath 表达式时对您有所帮助的事情。
如果run
是HtmlNode
,则:
run.SelectNodes("//div[@class='date']")
威尔的行为会和doc.DocumentNode.SelectNodes("//div[@class='date']")
一模一样run.SelectNodes("./div[@class='date']")
将为您提供作为run
节点子节点的所有<div>
节点。它不会更深入地搜索,只会在下一个深度级别。run.SelectNodes(".//div[@class='date']")
将返回具有该类属性的所有<div>
节点,但不仅在run
节点旁边,而且还将深入搜索(它的每个可能的后代(
您将不得不在 2. 或 3. 之间进行选择,具体取决于哪一个满足您的需求:)
在 XPATH 中,//
表示当前节点下的所有子节点和孙子节点。所以你需要想出一个更严格的XPATH表达式。如果您提供真实的 HTML,以及您正在寻找的内容,我们可以帮助您进一步挖掘。
关于您遇到的错误:
.div[@class='date']
无效,因为.
坚持div
。你可以使用div[@class='date']
,或者我认为是等效的./div[@class='date']
。这是因为.
是XPATH斧头,它是self
的别名,表示"当前节点"。