This is the xpath text i tried to use along with HtmlAgilityPack C# parser.
//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
I tried to evaluate the xpath expression with firefox xpath add=on and sucessfully got the required items. But the c# code returns an Null exception.
HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");
MessageBox.Show(node.ToString());
the node always contains null value... Please help me to find the way to get around this problem... Thank you..
<tbody/>
Tags to be InsertedAll common browser extensions for building XPath expressions work on the DOM. Opposite to the HTML specs, the DOM specs require <tr/>
elements to be inside <tbody/>
elements, so browsers add such elements if missing. You can easily see the difference if looking at the HTML source using Firebug (or similar developer tools working on the DOM) versus displaying the page source (using wget
or similar tools that do not interpret anything if necessary).
Remove the /tbody
axis step, and your XPath expression will probably work.
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']
<tbody/>
TagsFor a more general solution, you could replace the /tbody
axis step by a decendant-or-self step //
, but this could jump into "inner tables":
//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']
Better would be to use alternative XPath expressions:
//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']
A cleaner XPath 2.0 only solution would be
//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']