2017-06-27 1 views
0

J'utilise HTMLAgilityPack pour analyser des cellules à partir d'une table. D'après ce que je comprends, ce code ne devrait sortir "test" qu'une seule fois. Mais pour une raison quelconque, il sort "test" deux fois, et deux fois plus toutes les 10 secondes.HTMLAgilityPack sortie répétée

Image de sortie: https://i.gyazo.com/714a880a626c262b03df2b49dcb7711a.png

que je fais quelque chose de mal, ou est-ce un problème avec HTMLAgilityPack? J'ai essayé plusieurs solutions pour accomplir ceci sur StackOverflow et d'autres sites Web de didacticiel, mais chaque solution que j'ai essayée l'a fait. Je dois être capable de lire chaque cellule, et c'est juste moi tester si je pouvais juste obtenir une sortie sans répétition, mais je suppose que je ne peux pas.

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml("<tr><td>test</td><td>test 2</td></tr>"); 

var rows = doc.DocumentNode.SelectNodes("//tr"); 

if (rows != null && rows.Count > 0) 
{ 
     foreach (var row in rows) 
     { 
      var cells = row.SelectNodes(".//td"); 
      Console.WriteLine(cells[0].InnerText); 
      return; 
     } 
} 
+1

Vous ne nous montrez pas le code pertinent. Qu'est-ce qui appelle cette méthode? S'il vous plaît nous montrer un [mcve] – AakashM

+0

Vous accédez uniquement à la ** première ** cellule après avoir appelé 'SelectNodes()'. Vous devez parcourir la collection ** entière **: 'var cells = row.SelectNodes (" .// td "); foreach (cellule var dans les cellules) {Console.WriteLine (cell.InnerText); } ' – kuujinbo

Répondre

0

Je ne reçois pas l'erreur que vous décrivez. Par conséquent, le problème doit résider dans tout code que vous utilisez pour appeler ce que vous avez publié dans votre question. Je ne sais pas ce qu'est ce code appelant, mais ci-dessous est un code qui lit toutes les cellules dans une table.

Tout d'abord, la table:

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(@" 
    <table> 
     <tr> 
      <td>test</td> 
      <td>test 2</td> 
     </tr> 
     <tr> 
      <td>test 3</td> 
      <td>test 4</td> 
     </tr> 
    </table> 
"); 

J'ai ajouté une ligne à votre exemple. Maintenant, je suppose que vous voulez mettre les valeurs dans un IEnumerable fortement typé de quelque sorte. Voici donc la classe sur laquelle le IEnumerable sera basé:

public class StronglyTypedRow { 
    public string columnOne {get;set;} 
    public string columnTwo {get;set;} 
} 

Et maintenant, le code qui lit les données Html dans un objet fortement typé:

var importedTable = new List<StronglyTypedRow>(); 

var rows = doc.DocumentNode.SelectNodes("//tr"); 

if (rows != null && rows.Count > 0) { 

    foreach (var row in rows) { 

     var cells = row.SelectNodes(".//td"); 

     var importedRow = 
      new StronglyTypedRow { 
       columnOne = cells[0].InnerText, 
       columnTwo = cells[1].InnerText 
      }; 

     importedTable.Add(importedRow); 

    } 
} 

Si vous désirez lire dans la console :

for(var r = 0; r < importedTable.Count(); r++) { 
    var ir = importedTable[r]; 
    Console.WriteLine(
     "Row " + r + 
     " | Column 1 = " + ir.columnOne + 
     ", Column 2 = " + ir.columnTwo 
    ); 
} 

Espérons que cela aide.