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

4
我需要从HTML代码(HtmlDocument或HtmlNodes列表)中提取节点对。
问题是,我需要选择一个具有class属性但没有任何值的节点(请参见图片),无论是来自List还是HtmlDocument都可以,我会选择最佳解决方案。
另一个更好的解决方案是选择“”节点及其直接后续兄弟::li[1](链接#2),这可能是我程序的一部分。链接#2似乎有所帮助,但我不知道如何使用它来“获取所有节点和其第一个后续兄弟”。
我想要2件事: - 一些代码以通过类获取“一个节点及其第一个后续节点”,我尚未使用XPathes(或w / e)因此我还不熟悉 - 如果可能的话,一种获取“具有class属性但无值”的节点的方法
问题是,我将稍后选择具有“valueless”类的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() ^^

链接: - 如何在HTML + HTMLAgilitypack中获取下两个节点 但我以前从未使用过这个(我可以使用它来选择“”节点及其紧随其后的节点(不会使用,太可怕了)

图片:

示例代码,我想要提取的内容 试图添加2张图片:输入图像描述

更新

好的,有了Hung Cao的帮助,我能够选择

<li class>

节点。

现在,我想做的事情(这是我最初解释过的,但对我来说甚至并不清楚^^,因此我将尝试使用一个具体的示例),即选择“节点”对,更确切地说是一个特定的节点和它的直接第一个兄弟节点。我有: <li class="A">...</> => 第一对 <li class="B">...</> => 第一对 <li class="A">...</> => 第二对 <li class="B">...</>=> 第二对

我想最终得到类A/类B对的集合或数组(实际上,我正在使用一个C#类,其中基本上是A的内容,并且其中有一个数组,我在其中存储B类的元素)。

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;
}
1个回答

3

说实话,我不太清楚你的问题,但这是我的尝试来回答它。

以下是一个获取“具有特定类名的节点及其后面的第一个节点”的代码片段,我还没有使用过XPath(或者其他叫法),所以我不太熟悉 -

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;

如果可能的话,获取一个“具有class属性但没有值的节点”的方法。
doc.DocumentNode.Descendants("li").Where(_ => string.IsNullOrEmpty(_.GetAttributeValue("class", "")))

我知道我的问题可能没有表述得非常清楚,不过你的第二个回答似乎是我想要的。对于第一个部分,我想要“轻松地”检索 <li class="directory"> 和 <li class>(紧随其后的那个,如果我没记错的话,那就是它的第一个兄弟节点),但多亏了你的帮助,我会尝试这样做,最坏的情况下,我会用两个循环。一个查找第一个<li>(目录),另一个查找<li class>,最终我将使用它们类似于 "directoryArray[0]" 与 "liArray[0]" 的方式联合起来使用。感谢你的帮助,我会尽快更新。 - DixiPoowa
好的,正如我之前所说,我使用了您的第二段代码,它完成了任务!我能够检索到 "<li class>" 节点,这已经非常有帮助了。谢谢。 - DixiPoowa
它帮我解决了其中一个问题,谢谢你。我更新了我的问题,希望得到我正在寻找的第二个答案,但如果我明天没有得到答案,我会将你的答案标记为已接受。我总是可以做我提到的两个循环 :) - DixiPoowa
最终,我按照之前所说的使用了循环来查找<li class>,并且我使用“.NextSibling.Descendants()”方法,成功获取了我的“pairs”^^ - DixiPoowa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接