Html Agility Pack – 问题选择子节点

我想将我的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 + "
"; ViewData["result"] += "Tyep: " + type + "
"; ViewData["result"] += "Distance: " + distance + "
"; ViewData["result"] += "Description: " + description + "
"; ViewData["result"] += run.InnerHtml.Replace("", ">") + "
" + "
" + "
"; }

我的问题是run.SelectSingleNode("//div[@class='date']").InnerText不会在给定的运行节点中选择具有给定XPath的节点。 它选择与整个文档中的XPath匹配的第一个节点。

如何在当前节点中选择具有给定XPath的单个节点?

谢谢。

更新

我尝试将我的XPath字符串更新为:

 string date = run.SelectSingleNode(".div[@class='date']").InnerText; 

这应该选择当前节点中的

元素,对吗? 好吧,我试过这个,但得到了这个错误:

表达式必须评估为节点集。 描述:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

exception详细信息:System.Xml.XPath.XPathException:Expression必须求值为节点集。

有什么建议?

在使用HtmlAgilityPackXPath表达式时,有些事情可以帮助您。

如果runHtmlNode ,那么:

  1. run.SelectNodes("//div[@class='date']")
    将表现完全像doc.DocumentNode.SelectNodes("//div[@class='date']")

  2. run.SelectNodes("./div[@class='date']")
    将为您提供run节点子节点的所有

    节点。 它不会深入搜索,只能在下一个深度级别搜索。

  3. run.SelectNodes(".//div[@class='date']")
    将返回具有该类属性的所有

    节点,但不仅会在run节点旁边,还会深入搜索(每个可能的后代)

您必须在2.或3.之间进行选择,具体取决于哪一个满足您的需求:)

在XPATH中, //表示当前节点下的所有子节点和大子节点。 所以你需要提出一个更严格的XPATH表达式。 如果您提供真实的HTML,以及您正在寻找的内容,我们可以帮助您进一步挖掘。

关于您的错误:

.div[@class='date']无效,因为. 坚持div 。 您可以使用div[@class='date']./div[@class='date']我相信它们是等效的。 这是因为. 是一个XPATH ax ,它是self的别名,意思是“当前节点”。