2010-11-01 12 views
1

je le code HTML suivant:Obtenir le texte à partir d'un nœud à l'aide HtmlAgilityPack

<div class="top"> 
    <p>Blah.</p> 
    I want <em>this</em> text. 
</div> 

Quelle est la notation XPath pour extraire la chaîne « I want <em>this</em> text. »? EDIT: Je ne veux pas nécessairement une seule expression XPath pour extraire la chaîne. La sélection de plusieurs nœuds, et l'itération sur eux pour produire la phrase, serait également très bien.

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(myHtml); 
doc.DocumentNode.SelectSingleNode("??????"); 

Répondre

1

Que voulez-vous extraire, des noeuds ou une chaîne?

Si vous voulez noeuds, "I want <em>this</em> text." est un fragment XML comprenant au niveau supérieur de deux noeuds de texte et un élément <em>, qui a un enfant de nœud de texte. Comme il a plusieurs nœuds au niveau supérieur, vous devez utiliser SelectNodes("xpath expression a la @Alejandro") plutôt que SelectSingleNode() pour les extraire.

Si vous voulez une chaîne de caractères, vous devez à nouveau utiliser SelectNodes(); puis itérer sur les nœuds sélectionnés et concaténer le outerHTML de chacun. Voir here pour un bon exemple de quelque chose de similaire.

En outre, votre exemple montre un peu peu ce que l'expression XPath vous donnera en général ce que vous voulez. Par exemple. voulez-vous tout après l'initiale <p>...</p> sous <div class="top">? Ou voulez-vous tout le texte sous le <div> sauf tous les éléments<p>? Ou peut-être autre chose? Bien sûr, si les expressions XPath de @ Alejandro fonctionnent pour vous, c'est déjà assez bien spécifié.

+0

Je veux extraire la chaîne "' Je veux ce text.' " – grautur

+0

En utilisant SelectNodes() et itérer sur chaque nœud, si je dois. – grautur

+0

@grautur: ok ... voir l'exemple auquel je suis lié dans ma dernière édition. J'ai du mal à trouver de la documentation pour le HTML Agility Kit ... savez-vous où il se trouve? J'ai téléchargé un fichier d'aide chm mais cela ne fonctionne pas dans Windows 7 apparemment. – LarsH

2
/div[@class='top']/p[.='Blah.']/following-sibling::node() 

ou

/div[@class='top']/node()[not(self::p)] 
+0

@Alejandro, il met le XPath dans SelectSingleNode(), mais aucune expression XPath ne lui donnera le résultat qu'il souhaite. – LarsH

+0

@Alejandro: Cela me donne "je veux", mais pas le reste de la phrase. @LarsH: Il ne doit pas être SelectSingleNode, je cherche juste un moyen d'obtenir la phrase entière (avec le html toujours intact). – grautur

+0

Oh, je vois maintenant. Il me donne la phrase entière si j'utilise SelectNodes() [selon la suggestion de LarsH]. – grautur