2012-10-30 52 views
1

我有一个巨大的HTML页面,我想从它取消值。刮HtmlAgilityPack

我试图使用Firebug来获取我想要的元素的XPath,但它不是一个静态的XPath,因为它是不时变化,所以我怎么能得到我想要的值。

下面的代码片段我想每小时木材,其位于20

<div class="boxes-contents cf"><table id="production" cellpadding="1" cellspacing="1"> 
    <thead> 
     <tr> 
      <th colspan="4"> 
       Production per hour:   </th> 
     </tr> 
    </thead> 
    <tbody> 
       <tr> 
      <td class="ico"> 
       <img class="r1" src="img/x.gif" alt="Lumber" title="Lumber" /> 
      </td> 
      <td class="res"> 
       Lumber: 
      </td> 
      <td class="num"> 
       20   </td> 
     </tr> 
       <tr> 
      <td class="ico"> 
       <img class="r2" src="img/x.gif" alt="Clay" title="Clay" /> 
      </td> 
      <td class="res"> 
       Clay: 
      </td> 
      <td class="num"> 
       20   </td> 
     </tr> 
       <tr> 
      <td class="ico"> 
       <img class="r3" src="img/x.gif" alt="Iron" title="Iron" /> 
      </td> 
      <td class="res"> 
       Iron: 
      </td> 
      <td class="num"> 
       20   </td> 
     </tr> 
       <tr> 
      <td class="ico"> 
       <img class="r4" src="img/x.gif" alt="Crop" title="Crop" /> 
      </td> 
      <td class="res"> 
       Crop: 
      </td> 
      <td class="num"> 
       59   </td> 
     </tr> 
      </tbody> 
</table> 
    </div> 
+1

可以请你发布一些代码,显示你已经尝试过。 – Simon

+0

这是一个地狱noobish审判与对象参考错误无论如何,我会把它虽然没用 –

回答

0
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.Load(fileName); 

var result = doc.DocumentNode.SelectNodes("//div[@class='boxes-contents cf']//tbody/tr") 
       .First(tr => tr.Element("td").Element("img").Attributes["title"].Value == "Lumber") 
       .Elements("td") 
       .First(td=>td.Attributes["class"].Value=="num") 
       .InnerText 
       .Trim(); 
+0

这是真的非常好的一段代码,但我想知道如何确定获取我想要的元素的代码。不要给我一条鱼,但要学会如何得到一条:D,我记得它:P –

1

使用HTML敏捷性包,你会想要做像下面这样的生产。

byte[] htmlBytes; 
MemoryStream htmlMemStream; 
StreamReader htmlStreamReader; 
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlBytes = webclient.DownloadData(url); 
htmlMemStream = new MemoryStream(htmlBytes); 
htmlStreamReader = new StreamReader(htmlMemStream); 
htmlDoc.LoadHtml(htmlStreamReader.ReadToEnd()); 

var table = htmlDoc.DocumentNode.Descendants("table").FirstOrDefault(); 

var lumberTd = table.Descendants("td").Where(node => node.Attributes["class"] != null && node.Attributes["class"].Value == "num").FirstOrDefault(); 

string lumberValue = lumberTd.InnerText.Trim(); 

警告,即“FirstOrDefault()可以返回null所以你应该把一些检查在那里。

希望有所帮助。

+0

首先非常感谢你的有用的职位,但是有没有更直接的方式来获得我想要从网页的值,特别是它不是用特定ID标记的值。 ? –

+0

从您提供的示例html中,我看不到任何唯一的ID,这会使您想要的数据提取更容易。 –

+0

不,你没有理解我我的意思是,当元素有一个ID我可以很容易地使用GetElementById得到它,所以有没有像GetElementById方法得到特定的节点没有嵌套的代码很直接的方式? –