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 />\";
}
我的问题是ѭ1不会在给定的运行节点中选择具有给定XPath的节点。它选择与整个文档中的XPath匹配的第一个节点。 如何在当前节点内选择具有给定XPath的单个节点? 谢谢。 更新资料 我尝试将XPath字符串更新为此:
string date = run.SelectSingleNode(\".div[@class=\'date\']\").InnerText;
这应该选择当前节点中的“ 3”元素,对吗?好吧,我尝试了这个,但是遇到了这个错误:   表达式必须计算为   节点集。说明:未处理   发生在   当前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\']\")
将为您提供所有属于“ 4”节点的子节点的“ 9”节点。它只会在下一个深度级别进行更深入的搜索。
run.SelectNodes(\".//div[@class=\'date\']\")
将返回所有具有该class属性的
<div>
节点,但不仅返回
run
节点旁边,还将返回深度搜索(它的每个后代) 您将必须在2.或3.之间进行选择,具体取决于哪一个满足您的需求:)     ,        在XPATH中,“ 14”表示当前节点以下的所有子代和大子代。因此,您需要提出一个限制性更强的XPATH表达式。如果您提供真实的HTML,以及您正在寻找的确切内容,我们可以帮助您进一步挖掘。 关于您遇到的错误:
.div[@class=\'date\']
无效,因为在
div
上贴有
.
。您可以使用
div[@class=\'date\']
./div[@class=\'date\']
,我认为它们是等效的。这是因为ѭ16是XPATH轴,是
self
的别名,表示\“当前节点\”。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...