2017-04-24 1 views
0

Je voudrais gratter une table dans un commentaire en utilisant HTMLAgilityPack. Par exemple, sur la page http://www.baseball-reference.com/register/team.cgi?id=f72457e4 il y a un tableau avec id="team_pitching". Je peux obtenir ce commentaire comme un bloc de texte avec:Scrape Table Inside Commentaire avec HTMLAgilityPack

var tags = doc.DocumentNode.SelectSingleNode("//comment()[contains(., 'team_pitching')]"); 

mais ma préférence serait de sélectionner les lignes de la table avec quelque chose comme:

var tags = doc.DocumentNode.SelectNodes("//comment()[contains(., 'team_pitching')]//table//tbody//tr"); 

ou

var tags = doc.DocumentNode.SelectNodes("//comment()//table[@id = 'team_pitching']//tbody//tr"); 

mais ces deux retournent null. Existe-t-il un moyen de le faire afin que je n'ai pas à analyser le texte manuellement pour obtenir toutes les données de la table?

Exemple HTML - Je cherche à trouver des noeuds à l'intérieur <!-- ... -->:

<p>not interesting HTML here</p> 
<!-- <table id=team_pitching> 
    <tbody><tr>...</tr>...</tbody>...</table> --> 
+0

Les messages de code, de données et d'erreur doivent être directement disponibles dans la publication. Veuillez lire [MCVE] guidance et [edit] post pour fournir un exemple concis de HTML qui reflète des parties du document original qui vous intéressent et qui, en même temps, démontre le problème que vous avez. –

+0

... -> –

Répondre

1

Contenu du commentaire n'est pas analysé comme noeuds DOM, de sorte que vous ne pouvez pas rechercher un commentaire à l'extérieur et à l'intérieur avec un seul commentaire XPath.

Vous pouvez obtenir InnerHTML du noeud de commentaire, rogner les balises de commentaire, le charger dans le HtmlDocument et interroger dessus. Quelque chose comme ceci devrait fonctionner

var commentNode = doc.DocumentNode 
    .SelectSingleNode("//comment()[contains(., 'team_pitching')]"); 
var commentHtml = commentNode.InnerHtml.TrimStart('<', '!', '-').TrimEnd('-', '>'); 
var commentDoc = new HtmlDocument(); 
commentDoc.LoadHtml(commentHtml); 
var tags = commentDoc.DocumentNode.SelectNodes("//table//tbody//tr"); 
+0

Cela fonctionne, mais il ne répond pas spécifiquement à la question. –