将HTML表解析为CSV的最佳方法

时间:2011-06-15 10:38:54

标签: c# html-parsing

我必须从现有网站上获取一些产品数据以放入数据库。数据全部采用HTML表格格式,模型编号是唯一的,但每个产品可以有任意数量的不同属性(因此我需要解析的表格都有不同的列和标题)。

<table>
<tr>
<td>Model No.</td>
<td>Weight</td>
<td>Colour</td>
<td>Etc..</td>
</tr>
<tr>
<td>8572</td>
<td>12 Kg</td>
<td>Red</td>
<td>Blah..</td>
</tr>
<tr>
<td>7463</td>
<td>7 Kg</td>
<td>Blue</td>
<td>Blah..</td>
</tr>
<tr>
<td>8332</td>
<td>42 Kg</td>
<td>Yellow</td>
<td>Blah..</td>
</tr>
</table>

这是我正在寻找的CSV输出格式:

Model-No,Attribute-Name,Attribute-Value
8572,"Weight","12 Kg"
8572,"Colour","Red"
8572,"Etc","Blah.."
7463,"Weight","7 Kg"
7463,"Colour","Blue"
7463,"Etc","Blah.."
8332,"Weight","42 Kg"
8332,"Colour","Yellow"
8332,"Etc","Blah.."

由于表格看起来都是有效的xhtml我可能会将每个表格加载到XmlDocument中,但有没有人有任何建议可以更好地完成此操作?感谢。

5 个答案:

答案 0 :(得分:5)

我可以想到3种方法:

  • HTML Agility pack:加载HTML并循环遍历元素并编写CSV。一些例子here
  • 使用正则表达式解析表格。
  • 如果您的HTML是XHTML(有效的XML),您可以编写XSLT模板以自动创建CSV。这是最新,但不是最简单的。

答案 1 :(得分:3)

假设您至少在.NET 3.5环境中,您可以随时使用Linq to XML。

答案 2 :(得分:1)

HtmlAgilityPack非常适合从html网页上抓取数据,使用它将表格废弃成某种中间对象,然后就可以从这个对象中形成一个csv文件。

答案 3 :(得分:0)

除了HtmlAgilityPack之外,Khaled Nassar也提到过。您可以通过jQuery apply .each('tr')来完成它,并将第1,第2和第3个子项分配给产品对象,您可以通过服务或处理程序发送该产品对象,从而创建cvs。

答案 4 :(得分:0)

有一种非常简单的方法(尽管是一种不合理的方式)来实现这一目标。如果它只是一个关闭,只需用excel中的表打开htm / html文件,然后将工作表保存为.csv文件(如果文件中的表外有任何数据,它可以很容易地从excel中删除)。

如果要重复此任务,可以在C#(或VB .net)中使用Microsoft.Office.Interop.Excel命名空间,使其自动化,如下所示:

using Microsoft.Office.Interop.Excel;

...

Application app = new Application();
app.ScreenUpdating = false;
app.DisplayAlerts = false;
app.AskToUpdateLinks = false;
app.Visible = false;

Workbook workbook = app.Workbooks.Open(fileName + ".html", false, false,
               Type.Missing, Type.Missing, Type.Missing, Type.Missing,
               Type.Missing, Type.Missing,
               Type.Missing, Type.Missing, Type.Missing, Type.Missing,
               Type.Missing, Type.Missing);


workbook.SaveAs(fileName + ".csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV);

workbook.Close(false, Type.Missing, Type.Missing);
workbook = null;
app.Quit();
app = null;

... 

对于这种情况,如果需要,应该很容易使用表标记上的Regex解析html文件中的非表。在Visual Studio 2005及更高版本中,您只需右键单击项目的引用,您就可以在.Net选项卡下找到Microsoft.Office.Interop.Excel。