Написать запрос для анализа HTML DOCUMENT с помощью HtmlAgilityPack - PullRequest
1 голос
/ 08 июня 2011

Я хочу получить A href этого элемента в span class = "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!

1 Ответ

2 голосов
/ 08 июня 2011

Не выбирайте «рейтинг» из всего 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']") должен это исправить.

...