2012-08-03 53 views
0

我试图从包含2-6个表格与HtmlAgilityPack之间的所有DIV中提取信息。HtmlAgilityPack检查表的数量并找到它们的“标题”

只要有表相同数量的,我可以用

var thirdTable = res.SelectSingleNode("table[3]"); 

每个表都包含TDS和第一个包含我要检查的名称得到没有任何问题的信息。目前,它是由

<table border="0" cellspacing="1" cellpadding="4" width="100%"> 
    <tbody> 
     <tr bgcolor="#505050"> 
      <td colspan="2" class="white"> 
       <b>Character Deaths</b> 
      </td> 
     </tr> 
    </tbody> 
</table> 

var charTest = thirdTable.ChildNodes[0].InnerText.StartsWith(checkInfo); 

完成,但由于表量从时间不同时间,我不能,而无需一个NullReferenceException提取信息。

如何检查表的数量,然后确定哪些表存在?

编辑:

 var URLCharacter = "http://www..." + tbSearch.Text; 
     HtmlAgilityPack.HtmlWeb doc = new HtmlAgilityPack.HtmlWeb(); 
     htmldocObject = doc.Load(URLCharacter); 
     //Find the right contentdiv 
     var res = htmldocObject.DocumentNode.SelectSingleNode("//div[@class='BoxContent']"); 
+0

是否要选择文字“角色死亡”?换句话说,你是否想在所有表格的第一个单元格中选择“res”所代表的元素中的文本? – Zasz 2012-08-03 17:19:02

+0

我想检查表的数量,然后检查它们有哪些“标题”,因为我想提取更多的数据。我面临的问题是div内并不总是有相同数量的表。 – Noxious 2012-08-03 18:02:48

回答

0

我会做的是尝试通过选择所有表格,跳过前两个拿到第三个表,然后采取下一个(第三个)。如果你得到一个元素,就用它做你想做的,否则什么都不做。

var thirdTable = res.Elements("table").Skip(2).FirstOrDefault(); 
if (thirdTable != null) 
{ 
    // do stuff 
} 

如果您使用的Elements()方法有问题,你可以使用SelectNodes()与更换适当的XPath。

var thirdTable = res.SelectNodes("table").Skip(2).FirstOrDefault(); 
+0

出于某种原因,我收到错误 未找到方法:'Int32 System.Environment.get_CurrentManagedThreadId()'。在这一行“var thirdTable = res.Elements(”table“)。Skip(2).FirstOrDefault();” – Noxious 2012-08-04 13:45:07

+0

我研究了一些,目前正在使用.net框架4(没有客户端分析),我需要一个更新的版本? – Noxious 2012-08-04 16:27:53

+0

不,应该使用3.5及以上版本,但是由于该例外,定位.net 4.5应该解决它。这个例外对我来说是新的。我看到对['Environment.CurrentManagedThreadId'](http://msdn.microsoft.com/en-us/library/system.environment.currentmanagedthreadid%28v=vs.110%29)的调用,它是一个.net 4.5的东西。这是你打电话还是被HAP打电话?如果你的目标是.net 4,它将不得不被移除/替换。它可能来自你生成的'res'。你介意包含代码吗? – 2012-08-04 17:25:32

相关问题