我想在 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查询的最后一行应用条件!
答案 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']")
应该解决这个问题。