2012-09-07 48 views
4

我有需要检索使用htmlagilitypack与C#2其他html元素中包含的html元素。如何使用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> 

之间 。

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

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

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

回答

1

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)依赖于基准比较的比较(这是第i mplementation细节部分)。

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

骑自行车通过这样的节点:

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

产地:

Node: strong 
Node: font 
Node: font 
+0

完美!非常感谢你。 – kseeley