使用HtmlAgilityPack获取最后一个html表

时间:2013-03-11 12:55:44

标签: html html-table html-agility-pack

我有一个html表结构。我需要获取最终<td>标记中第一个<tr>的值。这是我的表格结构。我在以下函数getFinalNodeValue中要求的值是“ 3 ”。

 <table id="test">
            <tr>
                <td>ID</td>
                <td>Name</td>
                <td>Age</td>
            </tr>
            <tr>
                <td>1</td>
                <td>Yasoda</td>
                <td>21</td>
            </tr>

            <tr>
                <td>2</td>
                <td>Samantha</td>
                <td>25</td>
            </tr>

            <tr>
                <td>3</td>
                <td>Sajee</td>
                <td>26</td>
            </tr>

        </table>


以下是我使用HtmlAgilityPack编写的代码。

 public String getFinalNodeValue(String URL)
        {
            var webGet = new HtmlWeb();
            var pageSource = webGet.Load(URL);

            var table = pageSource.DocumentNode.SelectSingleNode("//table[@id='test']//tr[1]");


            string id = null;


            IEnumerable<HtmlNode> trNodes = table.DescendantsAndSelf();

            foreach (var currentItem in trNodes)
            {
                if (currentItem == trNodes.Last())
                {
                    IEnumerable<HtmlNode> tdNodes = currentItem.Descendants();

                    foreach (var x in tdNodes)
                    {
                        if(x == tdNodes.First())
            {
                id = x.InnerText;
            }
            else
            {
                break;
            }
                    }

                }
                else
                {
                    continue;
                }
            }

            return id;

        }

该方法不返回值。任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:5)

这应该这样做:

    HtmlDocument doc = new HtmlDocument();
    doc.Load(MyHtmlFile);

    HtmlNode node = doc.DocumentNode.SelectSingleNode("//table[@id='test']/tr[last()]/td");
    Console.WriteLine(node.InnerText);

请注意XPATH last()功能

的用法

答案 1 :(得分:1)

用于填充table变量 - "//table[@id='test']//tr[1]"的XPath,选择第二个 TR元素,不选择表格。

这很有可能只是"//table[@id='test']"

此时,要将后代TR节点提取到trNodes变量中,您应该使用:

IEnumerable<HtmlNode> trNodes = table.SelectNodes("tr");

答案 2 :(得分:0)

如果你这样改变你的表:

<table id="test" runat="server">

您可以在代码隐藏中迭代它,如下所示:

HtmlTable myTable = this.test;
int rowCount = myTable.Rows.Count;
HtmlTableCell td = myTable.Rows(rowCount - 1).Cells(0);
string val = td.InnerText;