This is an answer for the OP requirements mentioned in the comments of the "Solution 1".
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
foreach (HtmlNode listItem in doc.DocumentNode.SelectNodes("//ul[@id='product_list']/li"))
{
string product = listItem.SelectSingleNode("./div[2]/h3/a").InnerText;
string price = listItem.SelectSingleNode("./div[3]/div/span[1]").InnerText;
string availability = listItem.SelectSingleNode("./div[3]/div/span[2]").InnerText;
}
EDIT: This is an answer for the OP requirements mentioned in the comments of this solution.
There is a slight difference with the XPath results that you get from Chrome and the HtmlAgilityPack's requirements.
So may I suggest that instead you to use the following tool in order to get the required XPaths:
https://hapxpathfinder.codeplex.com/
Now for the targeted products in "http://store.thirdgenerationshootingsupply.com/browse.cfm/2,3612.html":
string rowsXPath = "/html[1]/body[1]/table[1]/tr[4]/td[1]/table[1]/tr[1]/td[2]/table[2]/tr";
HtmlNodeCollection rows = doc.DocumentNode.SelectNodes(rowsXPath);
for (int i = 0; i < rows.Count; i++)
{
if (i % 2 != 0)
continue;
HtmlNode row = rows[i];
string product = row.SelectSingleNode("./td[2]/a/b").InnerText;
HtmlNode availabilityDiv = row.SelectSingleNode("./td[3]/div");
string availability = (availabilityDiv != null) ? availabilityDiv.InnerText : "Available";
string price = row.SelectSingleNode("./td[3]/table[1]/tr[1]/td[2]/span").InnerText;
}
And for the targeted products in "https://www.americanreloading.com/en/31-gunpowder":
foreach (HtmlNode listItem in doc.DocumentNode.SelectNodes("//ul[@id='product_list']/li"))
{
HtmlNode productAnchore = listItem.SelectSingleNode("./div[1]/h3/a");
string product = productAnchore.Attributes["title"].Value;
string availability = listItem.SelectSingleNode("./div[1]/div[1]/span[1]").InnerText;
string price = listItem.SelectSingleNode("./div[2]/span[@class='price']").InnerText;
}