HTMLAgilityPack如何获取带有id属性的td标签的innerText?

6

我正在尝试使用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。

1
你有检查过你所获取的那些ID吗?<td id="header2">,以及你从 (//td[@id='header1'"); 检索到的。 - Rahul Gokani
1
在HTML中,ID是header2,但在代码中,它被指定为header1 - Muhammad Adeel Zahid
你的代码看起来正确。你能把你的数据发布到某个地方吗? - Simon Mourier
3个回答

7

您正在尝试选择header1,但id是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”,还可以更好地解析节点而不进行上述循环(例如类似于//tr[@id='some-id']//td[contains(@id,'header')]的内容)。

0
您可以通过使用 InnerHtml 属性解决您的问题,例如:
var td = doc.GetElementbyId("header2").InnerHtml;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接