加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – HtmlAgilityPack SelectNodes表达式忽略具有特定属性的元

发布时间:2020-12-15 08:40:39 所属栏目:百科 来源:网络整理
导读:我试图选择除脚本节点以外的节点和一个名为’relativeNav’的类的ul.有人可以指引我走正确的道路吗?我已经搜索了一个星期,我无法在任何地方找到它.目前我有这个,但它显然也选择了// ul [@ class =’relativeNav’].反正是否有一个NOT表达式,以便SelectNode
我试图选择除脚本节点以外的节点和一个名为’relativeNav’的类的ul.有人可以指引我走正确的道路吗?我已经搜索了一个星期,我无法在任何地方找到它.目前我有这个,但它显然也选择了// ul [@ class =’relativeNav’].反正是否有一个NOT表达式,以便SelectNode会忽略那个?
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()"))
        {
            Console.WriteLine("Node: " + node);
            singleString += node.InnerText.Trim() + "n";
        }

解决方法

给定一个Html文档,其结构类似于:
<html>
<head><title>HtmlDocument</title>
</head>
<body>
<div>
<span>Hello Span World</span>
<script>
Script Text
</script>
</div>
<ul class='relativeNav'>
<li>Hello </li>
<li>Li</li>
<li>World</li>
</ul>
</body>
</html>

以下XPath表达式将选择所有不是脚本元素的节点,不包括具有类“relativeNav”的UL元素的所有子元素:

var nodes = htmlDoc.DocumentNode.SelectNodes("//body//*[not(parent::ul[@class='relativeNav']) and not(self::script)]/text()");

更新:忘记提及如果您需要排除ul [class =’relativeNav’]的任何子项而不管其深度如何,您应该使用:

"//body//*[not(ancestor::ul[@class='relativeNav']) and not(self::script)]/text()"

如果你想排除ul元素(在上面的例子中有些不相关,因为元素不包含文本),你应该指定:

"//body//*[not(ancestor-or-self::ul[@class='relativeNav']) and not(self::script)]"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读