我想将我的 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: 表达式必须评估为节点集。
//
不是表示从根节点的任何地方吗? - Alxandrchild::div[@class='data']
的东西,但我并不确定。完全不确定。 - Alxandr