HTML Agility pack: analyse d'une balise href
Comment aurais-je de manière efficace analyser la valeur d'attribut href de :
<tr>
<td rowspan="1" colspan="1">7</td>
<td rowspan="1" colspan="1">
<a class="undMe" href="/ice/player.htm?id=8475179" rel="skaterLinkData" shape="rect">D. Kulikov</a>
</td>
<td rowspan="1" colspan="1">D</td>
<td rowspan="1" colspan="1">0</td>
<td rowspan="1" colspan="1">0</td>
<td rowspan="1" colspan="1">0</td>
[...]
Je suis intéressé à avoir l'id du joueur, qui est: 8475179 Voici le code que j'ai pour l'instant:
//Iterate all rows (players)
for (int i = 1; i < rows.Count; ++i)
{
HtmlNodeCollection cols = rows[i].SelectNodes(".//td");
//new player
Dim_Player player = new Dim_Player();
//Iterate all columns in this row
for (int j = 1; j < 6; ++j)
{
switch (j) {
case 1: player.Name = cols[j].InnerText;
player.Player_id = Int32.Parse(/* this is where I want to parse the href value */);
break;
case 2: player.Position = cols[j].InnerText; break;
case 3: stats.Goals = Int32.Parse(cols[j].InnerText); break;
case 4: stats.Assists = Int32.Parse(cols[j].InnerText); break;
case 5: stats.Points = Int32.Parse(cols[j].InnerText); break;
}
}
Si vous avez codé en dur index dans la
Bon point. Je suis le recyclage des vieux code que j'ai écrit, donc je n'ai pas pensé à cela.
switch
, pourquoi voudriez-vous utiliser le for
boucle? Pourquoi ne pas player.Position = cols[2].InnerText;
Bon point. Je suis le recyclage des vieux code que j'ai écrit, donc je n'ai pas pensé à cela.
OriginalL'auteur JF Beaulieu | 2011-12-13
Vous devez vous connecter pour publier un commentaire.
Basé sur votre exemple, cela a fonctionné pour moi:
De l'utilisation réelle, vous devez ajouter la vérification des erreurs etc.
htmlDoc
dans laquelle nous nous trouvons tous les nœuds avec la classe de undMe', bien au contraire, nous pourrions utilisercols[j]
qui ont lehref
dans InnerHtml ?Vous faites une très forte hypothèse sur l'endroit où votre lien est situé - ce serait bien, mais est très rigide et va casser, c'est à dire si vous ajoutez une autre colonne. L'approche présentée ne serait pas depuis sa d'interrogation pour le lien sur un minimum d'hypothèses
En fait, le seul problème avec ceci est la
First()
qui est statique et apporte toujours le premier élément qu'il trouve. J'ai besoin de quelque chose de dynamique qui peut obtenir la réelle de l'élément.Ahhh... Trouvé:
var link = cols.Descendants("a").First();
car je ne veux de recherche dans les colonnes que j'ai déjà trouvé.c'est génial de réponse ... il a marché parfaitement. Le seul problème est de remplacer .D'abord par .FirstOrDefault , sinon il va lever une exception.
OriginalL'auteur BrokenGlass
Utiliser une expression XPath pour le trouver:
OriginalL'auteur csharptest.net