Obtenez des tables spécifiques avec le pack d'agilité HTML

c# html-agility-pack xpath

Question

Je ne parviens pas à obtenir des tables spécifiques avec HTML Agility Pack. Je ne peux pas non plus changer le code HTML, je ne peux donc pas utiliser d’autres ID, classes ou quoi que ce soit.

Quelqu'un peut-il me montrer comment accéder à chacune des tables suivantes?

<table class="newTable">
      //table 1 contents
    <table border="0" cellpadding="3" cellspacing="2" width="100%">
         //table 1 - A contents
    </table>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="newTable">
     //table 2 contents
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
        //table 2 - A contents
    </table>
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
       //table 2 - B contents
    </table>
    <table width="100%" cellspacing="2" cellpadding="0">
       //table 2 - C contents
    </table>
</table>
<table>
     //table 3 contents
</table>

En ce moment si je devais appeler le suivant

<table class="newTable">
      //table 1 contents
    <table border="0" cellpadding="3" cellspacing="2" width="100%">
         //table 1 - A contents
    </table>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="newTable">
     //table 2 contents
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
        //table 2 - A contents
    </table>
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
       //table 2 - B contents
    </table>
    <table width="100%" cellspacing="2" cellpadding="0">
       //table 2 - C contents
    </table>
</table>
<table>
     //table 3 contents
</table>

Je traverserais tout. Je veux pouvoir accéder aux tables différemment pour établir une corrélation avec l'emplacement où je stocke les données.

J'ai essayé de regarder quelque chose comme

doc.DocumentNode.SelectNodes("//table[1]");

mais utiliser un index ne semble pas fonctionner, quand j'essaie de spécifier une table avec elle, elle lit toujours dans toutes les tables ou aucune.

La même chose s’applique, cela ne fonctionne pas du tout ou obtient tout.

<table class="newTable">
      //table 1 contents
    <table border="0" cellpadding="3" cellspacing="2" width="100%">
         //table 1 - A contents
    </table>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="newTable">
     //table 2 contents
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
        //table 2 - A contents
    </table>
    <table width="100%" border="0" cellspacing="2" cellpadding="0">
       //table 2 - B contents
    </table>
    <table width="100%" cellspacing="2" cellpadding="0">
       //table 2 - C contents
    </table>
</table>
<table>
     //table 3 contents
</table>

J'utilise le package NuGet de HTML Agility Pack 1.4.9

MODIFIER:

Ma tentative pour obtenir SEULEMENT le tableau 1 - le contenu de A. Les deux donnent des exceptions nulles ou finales.

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table/tr/td/table[1]");

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]/tr/td/table[1]");

Réponse acceptée

L'erreur est avec votre deuxième appel, le "// tr / td" retournera à l'élément racine. Votre indexeur est la solution correcte pour la première partie de votre problème, la seconde peut être corrigée en spécifiant que vous souhaitez naviguer à partir de l'endroit où vous vous trouvez:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");
foreach (var cell in table.SelectNodes(".//tr/td")) // **notice the .**
{
     string someVariable = cell.InnerText
}

Vous ne savez pas quoi d'autre se passe, mais en étendant votre table de test à ce code , ce qui suit ne fonctionne que sur mon test. Cela peut signifier que vous devez partager un peu plus de contexte.

Voici le document que j'ai utilisé pour les tests:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");
foreach (var cell in table.SelectNodes(".//tr/td")) // **notice the .**
{
     string someVariable = cell.InnerText
}

Et ceci le code pour extraire les valeurs que vous recherchez:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");
foreach (var cell in table.SelectNodes(".//tr/td")) // **notice the .**
{
     string someVariable = cell.InnerText
}

Montre:

entrez la description de l'image ici

Mettre à jour

Ok, j'ai pris votre code HTML actuel et j'ai aussi une référence nulle. Il doit y avoir quelque chose qui confond grandement le Pack Agility, vous ne savez pas pourquoi. Quelques expériences avec l'API Linq semblent fonctionner, mais j'espère que cela peut être une alternative pour vous:

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[1]");
foreach (var cell in table.SelectNodes(".//tr/td")) // **notice the .**
{
     string someVariable = cell.InnerText
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi