HTMLAgilityPack获取带有id属性的td标记的innerText

时间:2013-03-16 11:36:48

标签: c# html html-agility-pack nodes html-table

我正在尝试使用带HTMLAgilityPack的id属性选择td的内部文本。

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个不同的td标签,标题为1到5。

3 个答案:

答案 0 :(得分:6)

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

您也可以直接使用GetElementById

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

答案 1 :(得分: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')]这样的东西。

答案 2 :(得分:0)

您可以使用InnerHtml属性解决您的问题,如:

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