Не выбирайте «рейтинг» из всего htmlDoc, выберите его из ранее найденного «основного».
Полагаю, вам нужно что-то вроде:
var lowestreview =
from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='rightcol']")
from rating in main.SelectNodes("//div[@class='rating']")
from ratingspan in rating.SelectNodes("//span[@class='star-img stars_4']")
from floatClear in ratingspan.SelectNodes("//span[@class='floatClear']")
select new { Rate = ratingspan.InnerText, AHref = floatClear.InnerHtml };
Я надеюсь, что он не завершится сбоем, если некоторые из этих divs и span отсутствуют: предыдущая версия HtmlAgilityPack вернула ноль вместо пустого списка, когда SelectNodes
ничего не нашел.
EDIT
Вам, вероятно, также нужно изменить «запрос xpath» для внутренних селектов: измените «//» на «.//» (дополнительно в начале), чтобы указать, что вы действительно хотите подузел. Если AgilityPack работает так же, как обычный XML-XPath (я не уверен на 100%), тогда «//» в начале будет искать в корне документа, даже если вы укажете его из подузла. ".//" всегда будет искать с узла, с которого вы ищете.
A main.SelectNodes("//div[@class='rating']")
(вероятно) также найдет <div class="rating">
s вне <div class="rightcol">
, найденного в предыдущей строке.
main.SelectNodes(".//div[@class='rating']")
должен это исправить.