Связанный с предикатами в HtmlAgilityPack - PullRequest
2 голосов
/ 12 февраля 2012

Я хочу получить данные с сайта. Я использую 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]");

Но это не работает. Это дает все три ссылки. Я хочу получить только первые две ссылки. Как это сделать?

Эй! Теперь я тоже хочу сделать 1 вещь.

Выше у меня есть только три ссылки с class = "href1". Предположим, у меня есть 10 ссылок с class = "href1". И я хочу получить только четыре ссылки с 6-й ссылки на 9-ю ссылку. Как получить эти четыре ссылки?

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Попробуйте применить обтекатель выбора якоря в скобках перед применением функции position():

var nodes = doc.DocumentNode.SelectNodes("(//a[@class='href1'])[position()<3]");
0 голосов
/ 12 февраля 2012

Почему бы просто не получить их все и использовать первые два из возвращенной коллекции? Независимо от того, что вам понадобится для xpath, это в конечном итоге будет гораздо менее читабельным, чем использование LINQ:

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