2011-06-15 112 views
2

我必須從現有網站抓取一些產品數據以放入數據庫。數據全部採用HTML表格格式,模型號碼是唯一的,但每個產品可以有任意數量的不同屬性(所以我需要解析的表格都有不同的列和標題)。將HTML表格解析爲CSV的最佳方法

<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

WinForm或WebApp? – 2011-06-15 10:43:31

+0

@Ash - WebApp - 我只是在將html表字符串轉換爲csv字符串後的代碼儘管 – Nick 2011-06-15 10:48:54

+0

請看這裏http://www.codeproject.com/Tips/142467/Convert-HTMLTable-to-Comma- Separated-Values – 2015-05-28 01:06:42

回答

1

HtmlAgilityPack對於從html網頁中抓取數據非常了不起,使用它將表格廢棄爲某種中間對象,然後可以從該對象中形成一個csv文件。

+0

聽說這一個奇蹟並且對任何想要解析HTML的人都是可取的 – eugeneK 2011-06-15 10:44:40

4

我能想到的3種方法可以做到這一點:

  • HTML Agility pack:通過元素加載HTML和循環,寫你的CSV。一些例子here
  • 使用Regex解析表格。
  • 如果您的HTML是XHTML(有效的XML),您可以編寫一個XSLT模板來自動創建CSV。這是neatest,但不是最簡單的一個。
+0

第四個選項可以是Linq to XML,但是在這裏有一點關於堆棧溢出的搜索表明HTML Agility Pack現在支持Linq to Object,就像Linq to XML一樣 更多:http://stackoverflow.com/questions/542194/c-is-there-a-linq-to-html-or-some-other-good-net-html-manipulation-api/542278#542278 – 2011-06-15 10:49:50

+0

任何你會避免使用XmlDocument循環瀏覽HTML? – Nick 2011-06-15 10:56:39

+0

不!我想不出這個選擇。這是一個有效的選擇,也許比其他的更好**如果HTML是有效的XML ** - 事情並非總是如此。 – Aliostad 2011-06-15 11:00:28

3

假設您至少在NET 3.5環境中,您可以隨時使用Linq到XML。

0

除了HtmlAgilityPack,Khaled Nassar還提到過。你可以通過jQuery apply .each('tr')來做到這一點,並將第一,第二和第三個孩子分配給產品對象,您可以通過服務或處理器發送產品對象,該對象將從中創建cvs。

0

有一個非常簡單的方法(儘管是一個無用的)來實現這一點。如果它只是一個關閉,只需打開帶有excel表格的htm/html文件,然後將表格保存爲.csv文件(如果文件中的表格外有任何數據,則可以輕鬆地從excel中刪除該表格)。

如果你要重複這個任務中,你可以使用C#的Microsoft.Office.Interop.Excel命名空間(或VB .NET),以它的幾行,像這樣的自動化:

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。