gpt4 book ai didi

c# - 如何使用 htmlagilitypack 获取 2 个周围 html 元素之间的 html?

转载 作者:行者123 更新时间:2023-11-30 12:49:11 26 4
gpt4 key购买 nike

我需要使用带有 C# 的 htmlagilitypack 检索包含在 2 个其他 html 元素中的 html 元素。

例如,我有以下内容:

<div id="div1" style="style definition here">
<strong>
<font face="Verdana" size="2">Your search request retrieved 0 matches.</font>
</strong>
<font face="Verdana" size="2">Some more text here.</font>
<br><br>
<!--more html here-->
</div>

我想返回之间的所有内容

<div id="div1">

第一个

<br>

不返回任何一个元素。

我无法理解为此所需的语法,所以如果有人能向我解释在忽略结束标记的同时获取存在于 2 个其他已知开始标记之间的 html 的最佳方法,我将非常感激。

我还应该提到,我需要首先在一个完整网页的周围 html 中找到 id 为 div1 的 div。

我不需要实际节点与来自特定 HtmlDocument 的节点具有引用相等性,它们只需要在内容方面相同即可。

最佳答案

当返回HtmlNode 实例时,对同一节点的多次调用将产生相同的引用。您可以利用它来发挥自己的优势(尽管这是一个实现细节,所以要小心)。

基本上,您会得到所有作为元素的后代,直到有问题的节点为止。您选择要开始的节点:

HtmlNode divNode = doc.DocumentNode.SelectSingleNode("div[@id='div1']");

你要上去的节点:

// Note that in this case, working off the first node is not necessary, just
// convenient for this example.
HtmlNode brNode = divNode.SelectSingleNode("br");

然后使用TakeWhile extension methodEnumerable class 上获取所有元素直到第二个元素,像这样:

// The nodes.
IEnumerable<HtmlNode> nodes = divNode.Descendants().
TakeWhile(n => n != brNode).
Where(n => n.NodeType == HtmlNodeType.Element);

TakeWhile方法(n => n != brNode)中的比较依赖于引用比较(即实现细节部分)。

最后一个过滤器只为您提供元素节点,因为这通常是您通过调用 SelectSingleNode 获得的;如果你想处理其他节点类型,你可以省略它。

像这样循环通过这些节点:

foreach (HtmlNode node in nodes)
{
// Print.
Console.WriteLine("Node: {0}", node.Name);
}

产生:

Node: strong
Node: font
Node: font

关于c# - 如何使用 htmlagilitypack 获取 2 个周围 html 元素之间的 html?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12313380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com