HtmlAgilityPack中如何从指定父节点获取time元素的datetime属性前四位
问题分析与修改方案
你的问题出在XPath的路径选择上:原来的//time是绝对路径,它会从整个HTML文档的根节点开始遍历,找到第一个匹配的<time>元素,而不是从你定位到的父节点下查找。
修改后的代码
要解决这个问题,只需要把XPath改成相对路径,在//time前面加上.(代表当前节点,也就是你已经定位到的父节点),这样就会限制搜索范围在目标父节点的后代节点中:
// 先获取目标父节点(保留你原来的定位逻辑) var targetParent = htmlDoc2.DocumentNode.SelectSingleNode("//a[@title='"+ entry.Value + "']").ParentNode; // 使用相对路径查找当前父节点下的time元素 var timeElement = targetParent.SelectSingleNode(".//time"); // 增加空值判断,避免空引用异常 if (timeElement != null && timeElement.Attributes["datetime"] != null) { var iets = timeElement.Attributes["datetime"].Value.Substring(0, 4); // 这里可以处理获取到的年份值 }
关键说明
.//time:.表示从当前节点(targetParent)开始,//表示查找该节点下所有层级的后代节点中的<time>元素,正好匹配你HTML结构里的嵌套关系。- 增加空值判断是个好习惯:如果因为HTML结构变化或者目标节点不存在,能避免程序抛出
NullReferenceException。
内容的提问来源于stack exchange,提问作者Kev_T
相关产品推荐
相关产品推荐

