编写查询以使用HtmlAgilityPack解析HTML DOCUMENT
本文关键字:HtmlAgilityPack 解析 HTML DOCUMENT 查询 | 更新日期: 2023-09-27 17:58:33
我想获得span class="floatClear"中评级最低的元素的A hrefspan 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 };
如果这些div和span中的一些不存在,我希望它不会崩溃:当SelectNodes
没有找到任何东西时,HtmlAgilityPack的前一个版本返回null而不是空列表。
编辑
您可能还需要更改内部选择的"xpath查询":将"//"更改为".//"(开头是多余的),以表示您确实想要一个子节点。如果AgilityPack的工作原理与常规XML XPath相同(我不能100%确定),那么开头的"//"将从文档的根进行搜索,即使您从子节点指定它也是如此。".//"将始终从您正在搜索的节点中进行搜索。
main.SelectNodes("//div[@class='rating']")
(可能)也会在上一行中找到的<div class="rightcol">
之外找到<div class="rating">
。main.SelectNodes(".//div[@class='rating']")
应该解决这个问题。