【问题标题】:html agility pack parse tablehtml敏捷包解析表
【发布时间】:2013-02-20 19:02:43
【问题描述】:

我有一张这样的桌子:

<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 敏捷包来解析它。我已经尝试过这段代码,但它没有返回预期的结果:这是代码:

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);
                }
            }

我正在获取每一列,因为我想对返回的内容进行一些处理。

我做错了什么?

【问题讨论】:

  • 你得到了什么?错误是什么?你得到了什么?
  • 页面一直在循环,所以我假设一个无限循环。引发了“System.OutOfMemoryException”类型的异常。
  • 该建议是否解决了您的问题?还是您还有问题?
  • 这让我找到了解决方案。

标签: c# html-agility-pack


【解决方案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())

在您的源中,[Age: 78] 和 [Age: 92] 的单元格在开头有一个 &lt;th&gt; 标签,而不是 &lt;td&gt;

【讨论】:

    【解决方案2】:

    这是我的解决方案。请注意您的 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();
            }
        }
    }
    

    截图:

    编辑:我必须补充一点,如果您要使用 &lt;th&gt; 标签,您必须将它们包含在 &lt;thead&gt; 标签中,然后将您的行包含在 &lt;tbody&gt; 标签中,以便您的 html 格式正确: )

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

    【讨论】:

    • 我在回来之前解决了它。我现在正在应用正则表达式来提取年龄数字并创建一个包含名称和年龄(即:姓名,年龄)的 csv 文件。
    • 谢谢。 HTML 敏捷包加快了我的进步。
    • 仅供参考,使用正则表达式解析 html 通常是个坏主意 codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
    • 我在 .NET 商店,您有什么建议?您提供链接的文章建议了替代方案,但找不到它。
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2012-08-23
    • 2010-10-27
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多