【发布时间】:2017-04-12 15:39:57
【问题描述】:
我正在尝试将 html 文件中的表格解析为数据集。我使用 vb.net 创建了一个 Windows 应用程序,我正在使用以下函数:
Public Function GetDataSet(ByVal strWebFilePath As String) As DataSet
Dim html As String = System.IO.File.ReadAllText(strWebFilePath)
html = WebUtility.HtmlDecode(html)
Dim dsHtml As New DataSet
Dim htmldoc As New HtmlAgilityPack.HtmlDocument
htmldoc.LoadHtml(html)
Dim tables = htmldoc.DocumentNode.SelectNodes("//table//tr") _
.GroupBy(Function(x) x.Ancestors("table").First())
For i As Integer = 0 To tables.Count - 1
Dim rows = tables(i).ToList()
dsHtml.Tables.Add(String.Format("Table {0}", i))
Dim headers = rows(0).Elements("th").Select(Function(x) x.InnerText.Trim).ToList()
If headers.Count > 0 Then
For Each Hr In headers
dsHtml.Tables(i).Columns.Add(Hr)
Next
For j As Integer = 1 To rows.Count - 1
Dim row = rows(j)
Dim dr = row.Elements("td").Select(Function(x) x.InnerText.Trim).ToArray()
dsHtml.Tables(i).Rows.Add(dr)
Next
Else
headers = rows(0).Elements("td").Select(Function(x) x.InnerText.Trim).ToList()
For ColumnIndex As Integer = 0 To headers.Count - 1
dsHtml.Tables(i).Columns.Add("F" & ColumnIndex.ToString)
Next
For j As Integer = 0 To rows.Count - 1
Dim row = rows(j)
Dim dr = row.Elements("td").Select(Function(x) x.InnerText.Trim).ToArray()
dsHtml.Tables(i).Rows.Add(dr)
Next
End If
Next
Return dsHtml
End Function
一切正常,直到我解析 html 表,它的第一行包含具有 colspan=2 的列(第一行被视为标题,即使它不包含 <th> )。所以它抛出了这个异常:
System.Data.dll 中出现“System.ArgumentException”类型的未处理异常 附加信息:输入数组长于此表中的列数。
考虑这个表格示例:
<table>
<tr><td colspan=2>Links</td></tr>
<tr><td>1</td><td>www.stackoverflow.com</td></tr>
<tr><td>2</td><td>www.sqlservercentral.com</td></tr>
<tr><td>3</td><td>www.dba.stackexchange.com/</td></tr>
</table>
有没有办法把第一行分成两列:
- 第一个包含
Links - 第二个包含自动生成的值(即:
Col1)
【问题讨论】:
标签: html vb.net winforms html-table html-agility-pack