【问题标题】:Html Agility Pack - – Extract Node with “empty” class Attribute OR Select a PAIR of nodes (one and its immediate following node)Html Agility Pack - - 提取具有“空”类属性的节点或选择一对节点(一个及其紧随其后的节点)
【发布时间】:2017-05-02 12:03:27
【问题描述】:

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

问题是我需要选择一个节点(从 List 或 HtmlDocument,没关系,我会选择最佳解决方案)具有类 Attribute 但根本没有值(见图)。

另一个(我认为更好的解决方案)是选择“”节点及其直接的following-sibling::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 但我以前从未使用过它(我可以用它来选择“”节点及其紧随其后的节点(不打算使用它,太吓人了)

图片:

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

更新

好的,在 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 的第一个兄弟姐妹(永远是&lt;li class="B"&gt;);

pairs.add(pair);


}

return pairs;
}

【问题讨论】:

    标签: c# html-agility-pack


    【解决方案1】:

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

    获取“一个类的一个节点及其第一个后续节点”的代码, 我还没有使用过 XPathes(或者它被称为),所以我不习惯 -

    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;
    

    如果可能的话,一种获取“具有类属性的节点”的方法 但没有价值”

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

    【讨论】:

    • 确实,我意识到它可能不是 100% 清楚的。但是,是的,您的第二个答案似乎正是我想要的。对于第一部分,我想“轻松”检索位
    • AND
    • (紧随其后的那个,所以如果我没记错的话是第一个兄弟),但感谢您帮助我会尝试,在最坏的情况下,进行2个循环,一个寻找第一个
    • (目录),另一个寻找
    • ,最终我会像“directoryArray”一样使用它[0]" 与 "liArray[0]" 一起使用。感谢您的帮助,我会尽快更新。
  • 好的,正如我之前所说,我使用了您的第二段代码,它完成了工作!我能够检索“
  • ”节点,这已经有很大帮助了。谢谢
  • 它可以帮助我解决两个问题之一,是的,谢谢。我更新了我的问题,希望得到我正在寻找的第二个答案,但如果我明天没有得到答案,我会将你的答案标记为已接受。我总是可以做我谈到的 2 个循环 :)
  • 最后,我按照我之前所说的做了,并使用循环来查找
  • ,然后我使用“.NextSibling.Descendants()”,我能够得到我的“pairs” " ^^
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签