html敏捷包解析表

时间:2013-02-20 19:02:43

标签: c# html-agility-pack

我有一张这样的表:

<table border="0" cellpadding="0" cellspacing="0" id="table2">
    <tr>
        <th>Name
        </th>
        <th>Age
        </th>
    </tr>
        <tr>
        <td>Mario
        </td>
        <th>Age: 78
        </td>
    </tr>
            <tr>
        <td>Jane
        </td>
        <td>Age: 67
        </td>
    </tr>
            <tr>
        <td>James
        </td>
        <th>Age: 92
        </td>
    </tr>
</table>

我正在使用html agility pack来解析它。我试过这段代码,但它没有返回预期的结果:这是代码:

foreach (HtmlNode tr in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
            {
                //looping on each row, get col1 and col2 of each row
                HtmlNodeCollection tds = tr.SelectNodes("td");
                for (int i = 0; i < tds.Count; i++)
                {
                    Response.Write(tds[i].InnerText);
                }
            }

我收到每一栏,因为我想对返回的内容进行一些处理。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以从外部foreach循环中获取单元格内容:

foreach (HtmlNode td in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td"))  
{  
    Response.Write(td.InnerText);   
}  

此外,我建议修剪和“取消内部文本的权限,以确保它是干净的:

Response.Write(HtmlEntity.DeEntitize(td.InnerText).Trim())

在您的来源中,[年龄:78]和[年龄:92]的单元格在开头有一个<th>标记,而不是<td>

答案 1 :(得分:0)

这是我的解决方案。请注意您的HTML格式不正确,因为TH应该是TD

<table border="0" cellpadding="0" cellspacing="0" id="table2">
    <tr>
        <th>Name
        </th>
        <th>Age
        </th>
    </tr>
        <tr>
        <td>Mario
        </td>
        <td>Age: 78
        </td>
    </tr>
            <tr>
        <td>Jane
        </td>
        <td>Age: 67
        </td>
    </tr>
            <tr>
        <td>James
        </td>
        <td>Age: 92
        </td>
    </tr>
</table>

这是c#代码:

using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
            document.Load("page.html");

            List<HtmlNode> x = document.GetElementbyId("table2").Elements("tr").ToList();

            foreach (HtmlNode node in x)
            {
                List<HtmlNode> s = node.Elements("td").ToList();
                foreach (HtmlNode item in s)
                {
                    Console.WriteLine("TD Value: " + item.InnerText);
                }
            }
            Console.ReadLine();
        }
    }
}

截图: enter image description here

修改:我必须补充一点,如果您打算使用<th>代码,则必须将其包含在<thead>代码中,然后将其添加到<tbody>代码中,以便你的HTML格式很好:)

更多信息:http://www.w3schools.com/tags/tag_thead.asp