HtmlAgilityPack을 사용하여 HTML DOCUMENT를 구문 분석하기위한 쿼리 작성

c# html html-agility-pack linq

문제

Span class = "floatClear" 에서 해당 요소의 A href를 얻고 싶습니다.
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에서 "rating"을 선택하지 말고 이전에 찾은 "main"에서 선택하십시오.

나는 당신이 다음과 같은 것을 필요로한다고 생각한다.

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 span이없는 경우 충돌이 발생하지 않기를 바랍니다. 이전 버전의 HtmlAgilityPack에서는 SelectNodes 가 아무 것도 찾지 못했을 때 빈 목록 대신 null을 반환했습니다.

편집하다
내부 선택을위한 "xpath 쿼리"를 변경해야 할 수도 있습니다. "//"를 ".//"(처음에는 추가.)로 변경하여 실제로 하위 노드가 있음을 알립니다. AgilityPack이 일반 XML-XPath와 똑같이 작동한다면 (나는 100 % 확실하지 않다), 처음에 "//"는 서브 노드에서 지정하더라도 문서 루트에서 검색합니다. ".//"는 항상 검색중인 노드에서 검색합니다.

main.SelectNodes("//div[@class='rating']") 는 이전 줄에서 찾은 <div class="rightcol"> 외부의 <div class="rightcol"> <div class="rating"> . main.SelectNodes(".//div[@class='rating']") 는이를 수정해야합니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow