C# html 敏捷包按类名获取元素
Posted
技术标签:
【中文标题】C# html 敏捷包按类名获取元素【英文标题】:C# html agility pack get elements by class name 【发布时间】:2022-03-07 21:05:07 【问题描述】:我正在尝试获取他们的类包含某个单词的所有 div:
<div class="hello mike">content1</div>
<div class="hello jeff>content2</div>
<div class="john">content3</div>
我需要获取他们的类包含单词“hello”的所有 div。 像这样的:
resultContent.DocumentNode.SelectNodes("//div[@class='hello']"))
我如何使用敏捷包做到这一点?
【问题讨论】:
【参考方案1】:我明白了:
resultContent.DocumentNode.SelectNodes("//div[contains(@class, 'hello')]")
【讨论】:
【参考方案2】:从 html Agility Pack v1.6.5 版本开始,它包含.HasClass("class-name")
扩展方法。
IEnumerable<HtmlNode> nodes =
htmlDoc.DocumentNode.Descendants(0)
.Where(n => n.HasClass("class-name"));
【讨论】:
Above 比最流行的答案快 5 倍 - 尽管我使用 document.DocumentNode.Descendants().Where(x => x.HasClass(....【参考方案3】:我敢肯定,因为您的 div 中有多个类,所以这是行不通的。你可以试试这个:
resultContent.DocumentNode.Descendants("div").Where(d => d.Attributes["class"].Value.Contains("hello"));
【讨论】:
与其他答案相比有一个缺点:如果有一个没有class
的 div,它会引发异常。改用这个:.Where(d => d.GetAttributeValue("class", "").Contains("hello"));
【参考方案4】:
由于您已指定该类必须包含某个单词,因此以下将确保该单词是:
在字符串的开头,后跟一个空格 或在字符串中间并被空格包围 或在字符串的末尾并以空格开头 或类属性中唯一的类名它通过比较由空格包围的类属性的值与由空格包围的指定单词 (hello
) 来实现。这是为了避免像class="something-hello-something"
这样的误报
resultContent.DocumentNode.SelectNodes("//div[contains(concat(' ', @class, ' '), ' hello ')]");
【讨论】:
【参考方案5】:HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.Load(filePath);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//div[@class='hello']")
//code
【讨论】:
不起作用。 OP 尝试查找类 包含 一个单词作为子字符串的所有 div,例如hello
。您只选择类 hello
的 div以上是关于C# html 敏捷包按类名获取元素的主要内容,如果未能解决你的问题,请参考以下文章