使用HtmlAgilityPack解析带有Headers,Tables,Rows,Cells的HTML

时间:2014-02-14 22:24:15

标签: html-agility-pack

我正在尝试使用HtmlAgilityPack解析网页的HTML来解析表格的行/单元格。

代码示例几乎可以工作,除了我在Table集合上获得异常。我认为这可能与Header没有格式化为集合有关(我无法修改HTML的来源)。

请帮助您使用代码,或者请提供替代方案或解决方法。

结构是: 标题 - >表 - >行 - >细胞

有一组标题(包含日期),包含表的集合,其中包含一组行,而行包含一组单元格。

string html = @"
<html>
<body>
<h3>February 8, 2014</h3>    
    <table>
        <tr>
            <td><b>Site</b></td>
            <td><b>ColumnA</b></td>
            <td><b>ColumnB</b></td>
            <td><b>ColumnC</b></td>
        </tr>
        <tr>
            <td>SiteA</td>
            <td>3</td>
            <td>6</td>
            <td>3</td>
        </tr>
        <tr>
            <td>SiteB</td>
            <td>4</td>
            <td>6</td>
            <td>2</td>
        </tr>
        <tr>
            <td>SiteC</td>
            <td>4</td>
            <td>9</td>
            <td>4</td>
        </tr>
    </table>
<h3>February 7, 2014</h3>    
    <table>
        <tr>
            <td><b>Site </b></td>
            <td><b>ColumnA</b></td>
            <td><b>ColumnB</b></td>
            <td><b>ColumnC</b></td>
            </tr>
        <tr>
            <td>SiteA</td>
            <td>2</td>
            <td>4</td>
            <td>1</td>
        </tr>
        <tr>
            <td>SiteB</td>
            <td>1</td>
            <td>1</td>
            <td>2</td>
        </tr>
        <tr>
            <td>SiteC</td>
            <td>2</td>
            <td>6</td>
            <td>1</td>
        </tr>
    </table>
</body>
</html>
";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode header in doc.DocumentNode.SelectNodes("//h3"))
{
    string headerDate = header.InnerText;

    foreach (HtmlNode table in header.SelectNodes("table"))  //System.NullReferenceException
    {
        foreach (HtmlNode row in table.SelectNodes("tr"))
        {
            Console.Write(headerDate);
            foreach (HtmlNode cell in row.SelectNodes("td"))
            {
                Console.Write("\t" + cell.InnerText);
            }
            Console.WriteLine();
        }
    }
}

预期结果:

February 8, 2014    Site    ColumnA ColumnB ColumnC
February 8, 2014    SiteA   3   6   3
February 8, 2014    SiteB   4   6   2
February 8, 2014    SiteC   4   9   4
February 7, 2014    Site    ColumnA ColumnB ColumnC
February 7, 2014    SiteA   2   4   1
February 7, 2014    SiteB   1   1   2
February 7, 2014    SiteC   2   6   1

谢谢。杰克。

1 个答案:

答案 0 :(得分:0)

您正在迭代标题,就好像您希望表格在标题标记内一样,但是标题标记中的表格不是,尽管误导性缩进似乎表明。标题标记是表格的兄弟,而不是父母

<h3>February 8, 2014</h3>  <-- </h3> closes the header tag
<table>                    <-- this is the next element at the same level, not a child
    <tr>
        <td><b>Site</b></td>
        <td><b>ColumnA</b></td>
        <td><b>ColumnB</b></td>
        <td><b>ColumnC</b></td>
    </tr>
</table>

请记住,缩进/空格在html中毫无意义。它是统治所有标签的标签。