我正在尝试使用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
谢谢。杰克。
答案 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中毫无意义。它是统治所有标签的标签。