c# – Html Agility Pack – 用“空”类提取节点属性或选择节点的PAIR(一个及其紧随的节点)

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

问题是我需要选择一个节点(来自List或HtmlDocument,无论我选择最佳解决方案)都有一个类属性但根本没有值(见图片).

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

我想要两件事:
– 一些代码来获取“一个节点和一个节点的第一个节点”,我还没有使用XPathes(或者它被称为),所以我不习惯
– 如果可能的话,获得“具有类属性但没有值”的节点的方法

问题是,我将不得不选择带有“无价值”类的HtmlNode,我正在寻找一种方法来实现它.这个想法(如果还不够清楚)将是这样的:

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() ^^’

链接:
– How to get next 2 nodes in HTML + HTMLAgilitypack
但我之前从未使用过这个(我可以使用它来选择“”节点及其紧随其后的节目(不会使用它,方式太幽灵)

> select an element next to current element HtmlAgilityPack
我正计划使用这个但是我从来没有使用过xpath用于htmldoc(现在调查它)

图片:

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

更新

好的,在洪曹的帮助下,我能够选择

<li class>

节点.

现在,我想做什么(这是我第一次解释但是它不是很清楚,即使对我来说^^所以我会尝试使用一个具体的例子),更精确地选择“对”节点一个特定节点及其直接的第一个兄弟节点.我有 :

< li class =“A”> …< /> =>第一对
< li class =“B”> …< /> =>第一对
< li class =“A”> …< /> =>第二对
< li class =“B”> …< /> =>第二对

我想最终得到一个包含A / B类对的Collection或Array(实际上,我使用的是ac#类,它基本上是A的内容,并且在其中有一个数组,我存储了B类的元素).

tl;博士:我想要一些类似的东西
公共列表 ExtractPairs(HtmlAgilityPack.HtmlDocument htmlDoc){

List<Pair> pairs = new List<>();

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

配对=新配对(节点,节点
这里的第一个兄弟姐妹(这将永远是< 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", "")))
点赞