2011-06-08 34 views
1

我想獲得該元素的A HREF在跨度類=「floatClear」其評級是最小
跨度類=「星IMG stars_4」寫入查詢來解析HTML文檔與HtmlAgilityPack

如何使用HtmlAgilityPack實現這種行爲我有給我的文件

<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> 

我寫的查詢的HTML源

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

您確定這是正確的查詢嗎?您正在選擇一堆*獨立*節點:無論是否使用「rightcol」div(等等),您都可以獲得所有「評級」div。 – 2011-06-08 07:21:33

+1

我不確定這是爲什麼我問! – 2011-06-08 07:25:54

+0

是否必須在一個查詢中? – 2011-06-10 17:22:12

回答

2

不要從整個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 ANS的跨度是不存在的:在HtmlAgilityPack以前版本的空返回一個空列表,而不是當SelectNodes沒有找到任何內容。

編輯
您可能還需要更改內部選擇的「xpath查詢」:將「//」更改爲「.//」(在開始處額外)以表示您確實需要子節點。如果AgilityPack與常規的XML-XPath工作方式相同(我不是100%確定的),那麼即使從子節點指定,開頭的「//」也會從文檔的根目錄搜索。 「.//」將始終從您正在搜索的節點搜索。

A main.SelectNodes("//div[@class='rating']")將(也許)在上一行中找到的<div class="rightcol">之外也會找到<div class="rating"> s。 A main.SelectNodes(".//div[@class='rating']")應該解決這個問題。

+0

我認爲第二行應該是從htmlDoc.DocumentNode.SelectNodes(「// span [@ class ='floatClear']」)中的floatClear,因爲floatclear不是rightcol div的子節點。在編輯時你也提到要替換//是什麼(.//) – 2011-06-08 09:26:17

+0

@Zain我擴展了編輯。 – 2011-06-08 09:54:10