Я хочу получить A href этого элемента в классе span = "floatClear" , рейтинг которого минимален в
span class = "star-img stars_4"
Как я могу использовать HtmlAgilityPack для достижения такого поведения? Я даю html-источник моего файла
<div class="businessresult"> //will repeat
<div class="rightcol">
<div class="rating">
<span class="star-img stars_4">
<img height="325" width="84" src="http://media1.px" alt="4.0 star rating" **title**="4.0 star rating">
</span>
</div>
</div>
<span class="floatClear">
<a class="ybtn btn-y-s" href="/writeareview/biz/KaBw8UEm8u6war_loc%NY">
</span>
</div>
Запрос, который я написал
var lowestreview =
from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='rightcol']")
from rating in htmlDoc.DocumentNode.SelectNodes("//div[@class='rating']")
from ratingspan in htmlDoc.DocumentNode.SelectNodes("//span[@class='star-img stars_4']")
from floatClear in htmlDoc.DocumentNode.SelectNodes("//span[@class='floatClear']")
select new { Rate = ratingspan.InnerText, AHref = floatClear.InnerHtml };
Но я не знаю, как применить условие в последней строке запроса LINQ!
Не выбирайте «рейтинг» из всего 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 ans spanans отсутствуют: предыдущая версия HtmlAgilityPack вернула null вместо пустого списка, когда SelectNodes
ничего не нашли.
РЕДАКТИРОВАТЬ
Вероятно, вам также необходимо изменить «запрос xpath» для внутренних выборок: измените «//» на «.//» (дополнительно в начале), чтобы сигнализировать о том, что вы действительно хотите subnode. Если AgilityPack работает так же, как и обычный XML-XPath (я не уверен на 100%), тогда «//» в начале будет искать из корня документа, даже если вы укажете его из поднода. «.//» всегда будет искать поиск с узла, из которого вы ищете.
main.SelectNodes("//div[@class='rating']")
будет (вероятно) также найти <div class="rating">
s вне <div class="rightcol">
вы нашли в предыдущей строке , main.SelectNodes(".//div[@class='rating']")
должен исправить это.