【问题标题】:Write query to parse HTML DOCUMENT with HtmlAgilityPack编写查询以使用 HtmlAgilityPack 解析 HTML DOCUMENT
【发布时间】:2011-06-08 06:53:10
【问题描述】:

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

【问题讨论】:

  • 您确定这是正确的查询吗?您正在选择一堆 独立 节点:无论它们是否带有“rightcol” div(等等),您都会获得所有“评级” div。
  • 我不确定,这就是我问的原因!
  • 必须在一个查询中吗?
  • 没必要,我只需要解析 html 并获取最低评论产品的 url。

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


【解决方案1】:

不要从整个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 };

如果其中一些 div 和 span 不存在,我希望它不会崩溃:当 SelectNodes 没有找到任何东西时,以前版本的 HtmlAgilityPack 返回 null 而不是空列表。

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

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

【讨论】:

  • 我认为最后第二行应该来自 htmlDoc.DocumentNode.SelectNodes("//span[@class='floatClear']") 中的 floatClear(因为 floatclear 不是 rightcol div 的子节点。同样在 EDIT 中,您提到将 // 替换为它是什么 (.//)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2016-11-20
  • 2010-12-03
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多