C'est le texte xpath que j'ai essayé d'utiliser avec l'analyseur HtmlAgilityPack C #.
//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
J'ai essayé d'évaluer l'expression xpath avec firefox xpath add = on et j'ai obtenu les éléments requis. Mais le code c # renvoie une exception Null.
HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");
MessageBox.Show(node.ToString());
le noeud contient toujours une valeur nulle ... Aidez-moi à trouver le moyen de contourner ce problème ... Merci ..
<tbody/>
soient insérées Toutes les extensions de navigateur courantes permettant de créer des expressions XPath fonctionnent sur le DOM. Contrairement aux spécifications HTML, les spécifications DOM exigent que les éléments <tr/>
soient à l'intérieur des éléments <tbody/>
, afin que les navigateurs ajoutent de tels éléments s'ils sont manquants. Vous pouvez facilement voir la différence en regardant la source HTML à l'aide de Firebug (ou des outils de développement similaires travaillant sur le DOM) par rapport à l'affichage de la source de page (en utilisant wget
ou des outils similaires qui n'interprètent rien si nécessaire).
Supprimez l'étape /tbody
et votre expression XPath fonctionnera probablement.
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']
<tbody/>
HTML avec et sans <tbody/>
Pour une solution plus générale, vous pouvez remplacer le pas /tbody
par un pas //
, mais cela pourrait basculer dans les "tables internes":
//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']
Il serait préférable d’utiliser des expressions XPath alternatives:
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
Une solution uniquement XPath 2.0 plus propre serait
//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']