2012-02-16 7 views
1

Je souhaite récupérer des données à partir du site Web. J'utilise HtmlAgilityPack (C#). Dans le contenu du site est comme çaUtiliser des prédicats dans HtmlAgilityPack, Xpath

<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> 

Ici, nous avons 7 liens avec class = "href1". Je veux aller chercher seulement 3 liens (du 3ème lien au 5ème lien). Comment aller chercher ces liens particuliers?

Répondre

1

Vos données semblent déjà bien formées au format XML. Si vous êtes en train d'analyser des pages XHTML, vous pouvez probablement vous en passer avec les classes System.Xml du .NET Framework. Par exemple, pour charger vos données dans un XElement, vous pouvez utiliser:

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>"); 

Ensuite, pour sélectionner le troisième à cinquième <a> éléments dont class attribut a une valeur de href1, utilisez:

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

Si, d'autre part, vous avez une instance HtmlAgilityPack.HtmlDocument, vous pouvez exécuter une requête XPath en utilisant:

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

Ce genre de code:

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); 
    } 

vous donnera ce résultat:

node:A3 
node:A4 
node:A5 
+0

Merci beaucoup .. –

Questions connexes