Html Agility Pack - – 提取具有“空”class 属性的节点或 Select 一对节点(一个及其紧随其后的节点)

Html Agility Pack - – Extract Node with “empty” class Attribute OR Select a PAIR of nodes (one and its immediate following node)

我需要从 html 代码(HtmlDocument 或 HtmlNodes 列表)中提取节点对。

问题是我需要 select 一个具有 class 属性但没有值的节点(来自 List 或 HtmlDocument,无所谓我会选择最佳解决方案)完全没有(见图片)。

另一个(我认为更好的解决方案)是 select “” 节点及其紧随其后的兄弟节点::li[1](link #2),这可能是什么我会为我的程序的这一部分做。 Link #2 似乎有点帮助,但我不知道如何以“获取所有节点及其第一个后续兄弟节点”的方式使用它。

我想要两件事: - 一些代码来获得“一个节点 class 和它的第一个后续节点”,我还没有使用 XPathes(或 w/e 它被调用)所以我不习惯 - 如果可能的话,一种获得“具有 class 属性但没有值的节点”

的方法

问题是,稍后我将不得不 select 带有“无价值”的 HtmlNode class,我正在寻找一种方法来做到这一点。这个想法(如果还不够清楚的话)会是这样的:

var r = htmlDoc.DocumentNode.Descendants("li").Where(d => d.Attributes["class"].Value.Equals(NULL)); //I’m not sure about the [enter image description here][1].Value.Equals() ^^’

Links: - How to get next 2 nodes in HTML + HTMLAgilitypack 但我以前从未使用过它(我可以将它用于 select “” 节点及其紧随其后(不打算使用它,太恐怖了)

图片:

sample code of what I'd like to extract 尝试添加 2 张图片:enter image description here

更新

好吧,在 Hung Cao 的帮助下,我能够 select

<li class>

节点。

现在,我想做的(这是我第一次解释的,但不是很清楚,即使对我来说^^所以我会尝试使用一个具体的例子),是 select "pairs" 个节点,更准确地说是一个特定节点及其直接的第一个兄弟节点。我有 : <li class="A">...</> => 第一对 <li class="B">...</> => 第一对 <li class="A">...</> => 第二对 <li class="B">...</>=> 第二对

我想最终得到一个包含成对的 class A/class B 的集合或数组(实际上,我使用的是 c# class,它基本上是A的Content,里面有一个数组,里面存放了Bclass的元素)。

tl;dr:我想要符合 public List<Pair> ExtractPairs(HtmlAgilityPack.HtmlDocument htmlDoc){

的内容
List<Pair> pairs = new List<>();

foreach (HtmlNode node in htmlDoc.DocumentNode.SelectNodes("//li[@class='A']")) {

Pair pair = new Pair(node,node 在这里的第一个兄弟姐妹(永远是 <li class="B">);

pairs.add(pair);


}

return pairs;
}

TBH,我不太清楚你的问题,但这是我尝试回答的。

A bit of code to get “one node by class AND its first following node”, I haven’t used XPathes (or w/e it’s called) yet so I’m not used to -

public static bool HasClass(this HtmlNode node, params string[] classValueArray)
{
    var classValue = node.GetAttributeValue("class", "");
    var classValues = classValue.Split(' ');
    return classValueArray.All(c => classValues.Contains(c));
}
doc.DocumentNode.Descendants("li").FirstOrDefault(_ => _.HasClass("classname")).NextSibling;

If it’s possible, a way to get a “node which has the class Attribute but NO VALUE”

doc.DocumentNode.Descendants("li").Where(_ => string.IsNullOrEmpty(_.GetAttributeValue("class", "")))