C# html敏捷包解析表

C# html敏捷包解析表,c#,html-agility-pack,C#,Html Agility Pack,我有一张这样的桌子: <table border="0" cellpadding="0" cellspacing="0" id="table2"> <tr> <th>Name </th> <th>Age </th> </tr> <tr> <td>Mario <

我有一张这样的桌子:

<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>

名称
年龄
马里奥
年龄:78
简
年龄:67
詹姆斯
年龄:92
我正在使用html敏捷包来解析它。我已尝试此代码,但未返回预期结果:以下是代码:

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);
                }
            }
foreach(doc.DocumentNode.SelectNodes(//table[@id='table2']//tr)中的HtmlNode tr)
{
//在每行上循环,获取每行的col1和col2
HtmlNodeCollection tds=tr.SelectNodes(“td”);
对于(int i=0;i
我得到每一列是因为我想对返回的内容做一些处理


我做错了什么?

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

foreach (HtmlNode td in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td"))  
{  
    Response.Write(td.InnerText);   
}  
此外,我建议对内部文本进行修剪和去实体化,以确保其干净:

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

在您的源代码中,[Age:78]和[Age:92]的单元格在开始处有一个
标记,而不是
这是我的解决方案。请注意,您的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>

名称
年龄
马里奥
年龄:78
简
年龄:67
詹姆斯
年龄:92
这是c代码:

使用HtmlAgilityPack;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
HtmlAgilityPack.HtmlDocument document=新的HtmlAgilityPack.HtmlDocument();
document.Load(“page.html”);
列表x=document.GetElementbyId(“表2”).Elements(“tr”).ToList();
foreach(x中的HtmlNode节点)
{
List s=node.Elements(“td”).ToList();
foreach(s中的HtmlNode项)
{
Console.WriteLine(“TD值:”+item.InnerText);
}
}
Console.ReadLine();
}
}
}
截图:

编辑:我必须补充一点,如果要使用
标记,必须将它们包含在
标记中,然后将行包含在
标记中,以便html格式良好:)


更多信息:

您得到了什么?错误是什么?你得到了什么?页面一直在循环,所以我假设一个不确定的循环。引发了“System.OutOfMemoryException”类型的异常。该建议解决了您的问题吗?还是你还有问题?这让我找到了解决办法。我回来之前解决了。我现在开始应用正则表达式来提取年龄编号,并创建一个csv文件,该文件将包含姓名和年龄(即:姓名、年龄)。谢谢。HTML agility pack加快了我的进度。仅供参考,使用正则表达式解析HTML通常是个坏主意。我在.NET商店,你有什么建议?你提供链接的那篇文章提出了另一种选择,但在哪里都找不到。
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();
        }
    }
}