与HtmlAgilityPack中的谓词相关

时间:2012-02-11 21:13:36

标签: c# asp.net html-agility-pack

我想从网站上获取数据。我正在使用HtmlAgilityPack。在网站上的内容是这样的

<div id="list">
 <div class="list1">
   <a href="example1.com" class="href1" >A1</a>
   <a href="example4.com" class="href2" />
 </div>
 <div class="list2">
   <a href="example2.com" class="href1" >A2</a>
   <a href="example5.com" class="href2" />
 </div>
 <div class="list3">
   <a href="example3.com" class="href1" >A3</a>
   <a href="example6.com" class="href2" />
 </div>
</div>

现在,我想获取前两个具有class =“href1”的链接。我正在使用代码。

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@class='href1'][position()<3]");

但是,它没有用。它给出了所有三个链接。我想只获取前两个链接。怎么做?

喂!现在我也要做一件事。

上面,我只有三个链接class =“href1”。假设,我有10个与class =“href1”的链接。我想从第6个链接到第9个链接只获取4个链接。如何获取这些特定的四个链接?

2 个答案:

答案 0 :(得分:1)

尝试在应用position()函数之前将锚选择器包装在括号中:

var nodes = doc.DocumentNode.SelectNodes("(//a[@class='href1'])[position()<3]");

答案 1 :(得分:0)

为什么不直接使用返回的集合中的前两个?无论你需要做什么xpath,最终都会比使用LINQ更难以理解:

using System.Linq;
...
HtmlNodeCollection firstTwoHrefs = doc.DocumentNode
    .SelectNodes("//a[@class='href']").Take(2);