Используйте предикаты в HtmlAgilityPack, Xpath - PullRequest
1 голос
/ 16 февраля 2012

Я хочу получить данные с сайта. Я использую HtmlAgilityPack (C #). На сайте контент выглядит так

<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="list3">
   <a href="example4.com" class="href1" >A4</a>
   <a href="example6.com" class="href2" />
  </div>
  <div class="list3">
   <a href="example5.com" class="href1" >A5</a>
   <a href="example6.com" class="href2" />
  </div><div class="list3">
   <a href="example6.com" class="href1" >A6</a>
   <a href="example6.com" class="href2" />
  </div><div class="list3">
   <a href="example3.com" class="href1" >A7</a>
   <a href="example6.com" class="href2" />
  </div>
</div>

Здесь у нас есть 7 ссылок с class = "href1". Я хочу получить только 3 ссылки (от 3-й ссылки до 5-й ссылки). Как получить эти конкретные ссылки?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Этот код:

    HtmlDocument doc = new HtmlDocument();
    doc.Load(myHtmlFile);
    foreach (HtmlNode node in doc.DocumentNode.SelectNodes(
        "//div[@class='list3' and position() > 2 and position() < 6]/a[@class='href1']"))
    {
        Console.WriteLine("node:" + node.InnerText);
    }

даст вам такой результат:

node:A3
node:A4
node:A5
1 голос
/ 16 февраля 2012

Ваши данные уже выглядят как правильно сформированный XML.Если вы анализируете страницы XHTML, то, возможно, вам не помешает классы System.Xml .NET Framework.Например, чтобы загрузить ваши данные в XElement, вы можете использовать:

XElement xElement = XElement.Parse(@"
    <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=""list3"">
            <a href=""example4.com"" class=""href1"" >A4</a>
            <a href=""example6.com"" class=""href2"" />
        </div>
        <div class=""list3"">
            <a href=""example5.com"" class=""href1"" >A5</a>
            <a href=""example6.com"" class=""href2"" />
        </div>
        <div class=""list3"">
            <a href=""example6.com"" class=""href1"" >A6</a>
            <a href=""example6.com"" class=""href2"" />
        </div>
        <div class=""list3"">
            <a href=""example3.com"" class=""href1"" >A7</a>
            <a href=""example6.com"" class=""href2"" />
        </div>
    </div>");

Затем выбрать элементы с третьего по пятый <a>, чей атрибут class имеет значение href1, используйте:

var links = xElement.XPathSelectElements("//a[@class='href1']").Skip(2).Take(3).ToList();

Если, с другой стороны, у вас есть экземпляр HtmlAgilityPack.HtmlDocument, вы можете выполнить запрос XPath, используя:

HtmlNodeCollection links = htmlDoc.DocumentNode.SelectNodes("//a[@class='href1']");
var links3to5 = links.Cast<HtmlNode>().Skip(2).Take(3).ToList();
...