2013-03-16 566 views
5

我试图用HTMLAgilityPack选择带id属性的td的内部文本。HTMLAgilityPack获取带有id属性的td标签的innerText

HTML代码:

<td id="header1"> 5 </td> 
<td id="header2"> 8:39pm </td> 
<td id="header3"> 8:58pm </td> 
... 

代码:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 

doc.LoadHtml(data); 

var nodes = doc.DocumentNode.SelectNodes("//td[@id='header1']"); 

if (nodes != null) 
{ 
    foreach (HtmlAgilityPack.HtmlNode node in nodes) 
    { 
     MessageBox.Show(node.InnerText); 
    } 
} 

我不断收到空节点,因为我没有正确选择td标签,但不能找出我做错了...

编辑:

我犯了一个错误header1和header2,但有5个d标题为1到5的不同td标签。

+1

你检查这些ID你哈已采取。 ''td [@ id ='header1'“;'** – 2013-03-16 11:41:51

+1

在html中,id是'header2',而在代码中,它是被指定为'header1'。 – 2013-03-16 11:41:52

+0

你的代码似乎是正确的。你可以将数据发布到某个地方吗? – 2013-03-17 08:32:44

回答

6

您正在尝试选择header1,但标识为header2

你也可以直接使用GetElementById

var td = doc.GetElementbyId("header2"); 
1

嗯..我不认为你做错了什么。你的代码只能给你<td>id="header1"。如果你有,比方说,从header1header5,你可以这样做:

for (int i = 1; i <= 5; i++) { 
    var tdNode = doc.DocumentNode.SelectSingleNode(string.Format("//td[@id='header{0}']", i)); 

    //do something with the node here 
} 

虽然我建议你可以发布您的整个代码,这样我们就可以告诉你为什么你要null,也是一个更好的办法。的解析<td>节点而不做上面的循环(例如像//tr[@id='some-id']//td[contains(@id, 'header')]

0

您可以通过使用innerHTML属性一样解决您的问题:

var td = doc.GetElementbyId("header2").InnerHtml;