2013-03-15 2 views
0

J'essaie d'obtenir des données à partir d'une table html en utilisant le pack d'agilité html, mais continuez à obtenir uniquement les données dans la première ligne du tableau.HtmlAgilityPack lire des données à partir d'une page html

Le code html Je lis est le suivant:

<div id="mainDiv"> 
    <table id="tbl"> 
     <thead> 
      <tr> 
       <th class="tbl_col1">UserName</th> 
       <th class="tbl_col2">Points</th> 
      </tr> 
     </thead> 
     <tbody>  
      <tr data-source="provider1"> 
      <td class="tbl_col1"> 
       <a href="/Users/1090" id="UserLink" target="_blank">UserName1</a>   
      </td> 
      <td class="tbl_col2"> 
       <a href="/UserPoints/1090" id="PointLink" target="_blank">1892 <span class="up_arrow">&nbsp;</span></a>    
      </td>   
      </tr> 
      <tr data-source="provider2"> 
      <td class="tbl_col1"> 
       <a href="/Users/1090" id="UserLink" target="_blank">UserName2</a>   
      </td> 
      <td class="tbl_col2"> 
       <a href="/UserPoints/1090" id="PointLink" target="_blank">3217 <span class="down_arrow">&nbsp;</span></a>    
      </td>   
     </tr> 
     </tbody> 
    </table> 
</div> 

J'utilise ce code

var UserTable = htmlDocument.DocumentNode.SelectSingleNode("//div[@id='mainDiv']").SelectSingleNode("//table[@id='tbl']").SelectSingleNode("//tbody").SelectNodes("//tr"); 
foreach (var row in UserTable) 
{ 
    if (row.Attributes["data-source"] != null) 
    { 
     string Source = row.Attributes["data-source"].Value; 
     string UserName = row.SelectSingleNode("td[@class='tbl_col1']").SelectSingleNode("//a[@id='UserLink']/text()").InnerText; 
     string Points = row.SelectSingleNode("td[@class='tbl_col2']").SelectSingleNode("//a[@id='PointLink']/text()").InnerText; 
     Console.WriteLine(Source + "\t" + UserName + "\t" + Points); 
    } 
} 

Mais je continue à obtenir cette sortie:

provider1  UserName1  1892 
provider2  UserName1  1892 

Répondre

2

Vous avez mauvaises hypothèses: //a[@id='UserLink']/text() et //a[@id='PointLink']/text() recherches dans l'ensemble du document. C'est pourquoi vous obtenez le premier noeud tr. Il suffit d'utiliser:

string UserName = row.SelectSingleNode("td[@class='tbl_col1']/a[@id='UserLink']/text()").InnerText; 
string Points = row.SelectSingleNode("td[@class='tbl_col2']/a[@id='PointLink']/text()").InnerText; 

vous pouvez aussi vraiment simplifier le reste de votre code:

var UserTable = doc.DocumentNode.SelectNodes("//div[@id='mainDiv']/table[@id='tbl']/tbody/tr"); 
foreach (var row in UserTable) 
{ 
    if (row.Attributes["data-source"] != null) 
    { 
     string Source = row.Attributes["data-source"].Value; 
     string UserName = row.SelectSingleNode("td[@class='tbl_col1']/a[@id='UserLink']/text()").InnerText; 
     string Points = row.SelectSingleNode("td[@class='tbl_col2']/a[@id='PointLink']/text()").InnerText; 
     Console.WriteLine(Source + "\t" + UserName + "\t" + Points); 
    } 
} 
+0

Merci beaucoup! Cela a résolu pour moi. – yqit

Questions connexes