编写查询以使用HtmlAgilityPack解析HTML DOCUMENT

时间:2011-06-08 06:53:11

标签: c# html linq html-agility-pack

我想在 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查询的最后一行应用条件!

1 个答案:

答案 0 :(得分:2)

不要从整个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不存在,它不会崩溃:当SelectNodes没有找到任何内容时,HtmlAgilityPack的先前版本返回null而不是空列表。

EDIT
您可能还需要更改内部选择的“xpath查询”:将“//”更改为“.//”(开头的额外值)以表示您确实需要子节点。如果AgilityPack与常规XML-XPath的工作方式相同(我不是100%肯定),那么开头的“//”将从文档的根目录进行搜索,即使您是从子节点指定它也是如此。 “.//”将始终从您搜索的节点进行搜索。

main.SelectNodes("//div[@class='rating']")(可能)还会在您在上一行中找到的<div class="rating">之外找到<div class="rightcol">main.SelectNodes(".//div[@class='rating']")应该解决这个问题。