Напишите запрос для анализа HTML-документа с помощью HtmlAgilityPack

c# html html-agility-pack linq

Вопрос

Я хочу получить 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']") должен исправить это.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow