如何使用SelectNodes排除指定类?HtmlAgilityPack XPath报错求助
解决HtmlAgilityPack筛选不带指定类的
<tr>元素问题 你碰到的这个XPath错误,根源是not()函数的用法不对——它只能接受单个条件参数,你写成not(@class, 'group-head')这种传两个参数的方式,XPath解析器肯定不认啦。
下面给你两种靠谱的解决方案,根据你的实际场景选:
1. 简单场景(<tr>只有单个类)
如果目标表格里的<tr>要么只有group-head类,要么没有这个类(不会出现多个类的情况),直接用这个XPath就行:
HtmlNodeCollection rows = doc.GetElementById("page_player_1_block_player_trophies_5") .SelectNodes(".//tr[not(@class='group-head')]");
这里用.//tr而不是//tr是为了限定只在目标表格内部查找,避免误匹配页面上其他表格的行。
2. 严谨场景(<tr>可能有多个类)
要是你的<tr>可能同时有多个类(比如<tr class="group-head trophy-row">),上面的简单写法就会失效,因为@class的值是完整的字符串。这时候得用更严谨的匹配方式,确保只排除包含group-head这个完整类名的行:
HtmlNodeCollection rows = doc.GetElementById("page_player_1_block_player_trophies_5") .SelectNodes(".//tr[not(contains(concat(' ', @class, ' '), ' group-head '))]");
原理是把@class的值前后加上空格,再用contains()匹配带空格包裹的group-head,这样就能避免部分匹配(比如类名是group-head-extra这种情况)。
另外提醒一下,调用SelectNodes()后最好先判断返回的rows是否为null,避免空引用异常哦~
内容的提问来源于stack exchange,提问作者cojac
相关产品推荐
相关产品推荐

