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。

4

3 回答 3

7

您正在尝试选择header1,但 id 是header2.

也可以GetElementById直接使用:

var td = doc.GetElementbyId("header2");
于 2013-03-16T11:38:11.320 回答
1

嗯..我不认为你做错了什么。您的代码应该只给您<td>with id="header1"。如果你有,比方说 from header1to header5,你可以这样做:

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')]

于 2013-03-18T06:24:57.600 回答
0

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

var td = doc.GetElementbyId("header2").InnerHtml;
于 2016-09-08T09:52:52.353 回答