Html Agility Pack - 问题选择子节点

时间:2011-05-30 21:48:47

标签: c# asp.net-mvc 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 + "<br />";
    ViewData["result"] += "Tyep: " + type + "<br />";
    ViewData["result"] += "Distance: " + distance + "<br />";
    ViewData["result"] += "Description: " + description + "<br />";
    ViewData["result"] += run.InnerHtml.Replace("<", "&lt;").Replace(">", "&gt;") + "<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>元素,对吗?好吧,我试过这个,但得到了这个错误:

  

表达式必须评估为a   节点集。描述:未处理   期间发生了异常   执行当前的Web请求。   请查看堆栈跟踪了解更多信息   有关错误的信息和位置   它起源于代码。

     

异常详细信息:   System.Xml.XPath.XPathException:   表达式必须评估为a   节点集。

有什么建议吗?

2 个答案:

答案 0 :(得分:58)

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

如果runHtmlNode,则:

  1. run.SelectNodes("//div[@class='date']")
    将会表现得与doc.DocumentNode.SelectNodes("//div[@class='date']")

  2. 完全相同
  3. run.SelectNodes("./div[@class='date']")
    将为您提供<div>节点的子节点的所有run个节点。它不会深入搜索,只会在下一个深度级别进行搜索。

  4. run.SelectNodes(".//div[@class='date']")
    将返回具有该class属性的所有<div>个节点,但不仅会返回run节点旁边,还会深入搜索(每个可能的后代)

    < / LI>

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

答案 1 :(得分:3)

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

关于您的错误:

.div[@class='date']无效,因为.仅限于div。您可以使用我认为相同的div[@class='date']./div[@class='date']。这是因为.XPATH axe,它是self的别名,意味着“当前节点”。