HTML Agility Pack - 在特定节点之后选择节点

发布于 2024-08-14 19:45:19 字数 604 浏览 4 评论 0原文

在 Codeplex 讨论中提出了这个问题,但我希望得到一个stackoverflow 上有更快的答案。

因此,我使用 HTML Agility Pack 在 C# 中进行 HTML 解析。 我有以下 html 结构:

<body>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
   <p class="specific">text</p>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
</body>

我需要获取类“paragraph”的所有 p 元素,这些元素存在于类“specified”的 p 元素之后。

有办法做到这一点吗?

谢谢。

I asked the question in a codeplex discussion but I hope to get a quicker answer here at stackoverflow.

So, I use HTML Agility Pack for HTML parsing in C#.
I have the following html structure:

<body>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
   <p class="specific">text</p>
   <p class="paragraph">text</p>
   <p class="paragraph">text</p>
</body>

And I need to get all p elements with class "paragraph" that exist after the p element with class "specific".

Is there a way to do that?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

没有心的人 2024-08-21 19:45:19

使用 Mark 示例中的 .Class (如果不存在,请替换任何合适的内容)

使用 SkipWhile

,在 LINQPad 中,您会得到 5,6,7

int[] a = { 6, 5, 6 ,7 };
a.SkipWhile(x=>x!=6).Skip(1).Dump();

例如 根据 SelectNodes 返回的类型,要么:

.SelectNodes( "/p" ).SkipWhile( p => p.Class != "specific" ).Skip(1)

要么

.SelectNodes( "/p" ).Cast<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

(或者,丑陋的版本)

.SelectNodes( "/p" ).SkipWhile( p => ((XX)p).Class != "specific" ).Skip(1)

(或者在某些情况下 - 如果您的表达式已经适当过滤则不是)

.SelectNodes( "/p" ).OfType<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

编辑:我可能会创建一个扩展方法:

static class HapExtensions
{
    public IEnumerable<T> SkipUntilAfter( this IEnumerable<T> sequence, Predicate<T> predicate) {
        return sequence.SkipWhile( predicate).Skip(1);
       }
}

任何人都关心搜索现有技术这?有什么好的名字建议吗?

using .Class as in Mark's example (if that doesnt exist, substitute whatever is appropriate)

Use SkipWhile

e.g. in LINQPad you get 5,6,7 from:

int[] a = { 6, 5, 6 ,7 };
a.SkipWhile(x=>x!=6).Skip(1).Dump();

So depending on the type SelectNodes returns, either:

.SelectNodes( "/p" ).SkipWhile( p => p.Class != "specific" ).Skip(1)

or

.SelectNodes( "/p" ).Cast<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

(or, ugly version)

.SelectNodes( "/p" ).SkipWhile( p => ((XX)p).Class != "specific" ).Skip(1)

(or in some cases - not if your expression is already filtering appropriately)

.SelectNodes( "/p" ).OfType<XX>().SkipWhile( p => p.Class != "specific" ).Skip(1)

EDIT: I'd probably create an extension method:

static class HapExtensions
{
    public IEnumerable<T> SkipUntilAfter( this IEnumerable<T> sequence, Predicate<T> predicate) {
        return sequence.SkipWhile( predicate).Skip(1);
       }
}

Anyone care to search up prior art for this? Any good name suggestions?

并安 2024-08-21 19:45:19

试试这个

bool latterDayParagraphs = false;
List<DocumentNode> nodes = new List<DocumentNode>();
foreach(var pElement in doc.DocumentNode.SelectNodes("/p"))
{
   if(pElement.Class != "paragraph") 
   {
      latterDayParagraphs = true;
      continue;
   }
   if(latterDayParagraphs)
   {
      nodes.Add(pElement);
   }
}

Try this

bool latterDayParagraphs = false;
List<DocumentNode> nodes = new List<DocumentNode>();
foreach(var pElement in doc.DocumentNode.SelectNodes("/p"))
{
   if(pElement.Class != "paragraph") 
   {
      latterDayParagraphs = true;
      continue;
   }
   if(latterDayParagraphs)
   {
      nodes.Add(pElement);
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文