【问题标题】:Best way to parse an HTML table into a CSV将 HTML 表解析为 CSV 的最佳方法
【发布时间】:2011-09-15 10:22:50
【问题描述】:

我必须从现有网站上获取一些产品数据以放入数据库。数据都是 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 中,但有没有人有更好的方法来完成此操作?谢谢。

【问题讨论】:

标签: c# html-parsing


【解决方案1】:

我可以想到 3 种方法来做到这一点:

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

【讨论】:

  • 第 4 个选项可能是 Linq to XML,但在这里对堆栈溢出进行一点搜索表明 HTML Agility Pack 现在支持 Linq to Object 非常类似于 Linq to XML:stackoverflow.com/questions/542194/…
  • 您有什么理由避免使用 XmlDocument 循环浏览 HTML?
  • 不!我想不出那个选项。这是一个有效的选项,并且可能比其他选项更好如果 HTML 是有效的 XML - 并非总是如此。
  • 对“使用正则表达式”的注释:在这种情况下,这是可能的,但通常,HTML 不是正则语言,因此无法使用正则表达式解析!
【解决方案2】:

假设您至少处于 NET 3.5 环境中,您始终可以使用 Linq to XML。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 听说这个对于任何想要解析 HTML 的人来说都是奇迹和建议
    【解决方案4】:

    除了 HtmlAgilityPack,Khaled Nassar 也提到了。您可以通过 jQuery 应用 .each('tr') 来执行此操作,并将第一个、第二个和第三个子对象分配给产品对象,您可以通过服务或处理程序发送该产品对象,从而从中创建 cvs。

    【讨论】:

      【解决方案5】:

      有一种非常简单的方法(尽管不太优雅)来实现这一点。如果它只是一个关闭,只需使用 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;
      
      ... 
      

      对于这种情况,如有必要,使用表格标签上的正则表达式应该很容易解析出 html 文件中的非表格。在 Visual Studio 2005 及更高版本中,您只需右键单击项目的引用,您应该会在 .Net 选项卡下找到 Microsoft.Office.Interop.Excel。

      【讨论】:

        猜你喜欢
        • 2011-05-03
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 2010-10-02
        • 2011-04-06
        相关资源
        最近更新 更多