我必须从现有网站上获取一些产品数据以放入数据库。数据全部采用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中,但有没有人有任何建议可以更好地完成此操作?感谢。
答案 0 :(得分:5)
我可以想到3种方法:
答案 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。