2013-07-04 153 views
-1

我有一個巨大的HTML表格(約500,000行),我需要轉換成JSON文件。 表看起來是這樣的:將HTML表格轉換爲JSON

<table> 
<tr> 
<th>Id</th> 
<th>Timestamp</th> 
<th>Artist_Name</th> 
<th>Tweet_Id</th> 
<th>Created_at</th> 
<th>Tweet</th> 
<th>User_name</th> 
<th>User_Id</th> 
<th>Followers</th> 
</tr> 
<tr> 
<td>1</td> 
<td>2013-06-07 16:00:17</td> 
<td>Kelly Rowland</td> 
<td>343034567793442816</td> 
<td>Fri Jun 07 15:59:48 +0000 2013</td> 
<td>So has @MissJia already discussed this Kelly Rowland Dirty Laundry song? I ain't trying to go all through her timelime...</td> 
<td>Nicole Barrett</td> 
<td>33831594</td> 
<td>62</td> 
</tr> 
<tr> 
<td>2</td> 
<td>2013-06-07 16:00:17</td> 
<td>Kelly Rowland</td> 
<td>343034476395368448</td> 
<td>Fri Jun 07 15:59:27 +0000 2013</td> 
<td>RT @UrbanBelleMag: While everyone waits for Kelly Rowland to name her abusive ex, don't hold your breath. But she does say he's changed: ht…</td> 
<td>A.J.</td> 
<td>24193447</td> 
<td>340</td> 
</tr> 

我想創建一個JSON文件看起來某事像那:

{'data': [ 
    { 
    'text': 'So has @MissJia already discussed this Kelly Rowland Dirty Laundry song? I ain't trying to go all through her timelime...', 
    'id': 1, 
    'tweet_id': 343034567793442816 
    }, 
    { 
    'text': 'RT @UrbanBelleMag: While everyone waits for Kelly Rowland to name her abusive ex, don't hold your breath. But she does say he's changed: ht…', 
    'id': 2, 
    'tweet_id': 343034476395368448 
    } 
]} 
多用一些包括的變量,但應該是自我解釋

也許。

我已經看過幾個選項,但主要是我有問題,我的HTML表是如此之大。我看到很多人推薦jQuery。考慮到我的桌子的大小,這對我有意義嗎? 如果有合適的Python選項,我會非常青睞,因爲我一直在Python中編寫大部分代碼。

+3

哇,一個HTML表500,000行的人,這是巨大的,我會說太龐大了......爲什麼不使用分頁?順便說一句,從哪裏來第一個這個數據?我認爲你沒有硬編碼你的桌子,對吧?! –

+0

數據從Twitter進行抓取。我有一個數據庫,但出口到目前爲止只在HTML中成功。使用所有其他格式,數據庫工具取消了我的導出請求。 – Tom

回答

0

以下是示例代碼。

var tbl = $('table tr:has(td)').map(function(i, v) { 
var $td = $('td', this); 
    return { 
      Id: $td.eq(0).text(), 
      Timestamp: $td.eq().text(), 
      Artist_Name: $td.eq(2).text(), 
      Tweet_Id: $td.eq(3).text()    
      Tweet: $td.eq(4).text()    
      User_name: $td.eq(5).text()    
      User_Id: $td.eq(6).text()     
      Followers: $td.eq(7).text()     
      } 
}).get(); 
+1

與500,000行,我不會感到驚訝js發佈了一個錯誤,如腳本使得太多的時間來響應 –

+0

map()創建一個新的數組,這意味着這會比每個()更耗費資源 - 值得注意的是當你正在處理500,000行。 – verenion

+0

然後你應該使用setTimeout這將在很多行的IE瀏覽器行爲很糟 – wilsonrufus

0

你使用的是PHP嗎?如果是這樣,你可以使用HTML DOM解析和json_encode()來做一些事情。

如果你想使用jquery/javascript,這將是太大的過程 - 這是可能的,但它是不是很好用js處理這麼多的數據。不過,如果你只是做一次,你真的決心使用JS - 再有就是對SO類似的問題...

看看這個小提琴...

http://jsfiddle.net/s4tyk/

var myRows = []; 
var headersText = []; 
var $headers = $("th"); 

// Loop through grabbing everything 
var $rows = $("tbody tr").each(function(index) { 
    $cells = $(this).find("td"); 
    myRows[index] = {}; 

    $cells.each(function(cellIndex) { 
    // Set the header text 
    if(headersText[cellIndex] === undefined) { 
     headersText[cellIndex] = $($headers[cellIndex]).text(); 
    } 
    // Update the row object with the header/cell combo 
    myRows[index][headersText[cellIndex]] = $(this).text(); 
    });  
}); 

// Let's put this in the object like you want and convert to JSON (Note: jQuery will also do this for you on the Ajax request) 
var myObj = { 
    "myrows": myRows 
}; 
alert(JSON.stringify(myObj)); 

這是問題 How to convert the following table to JSON with javascript?

,如果你需要用JS幫助,就問我,但這應該讓你去。

0

使用Python和lxml package,你可以用

import lxml.html as LH 
import collections 
import itertools as IT 
import json 

Row = collections.namedtuple(
    'Row', 
    'id timestamp artist tweet_id created_at tweet user_name user_id, followers') 

filename = '/tmp/test.html' 
root = LH.parse(filename) 
data = [] 
result = {'data': data} 
for row in IT.starmap(Row, zip(*[iter(root.xpath('//tr/td/text()'))]*9)): 
    data.append({'text':row.tweet, 'id':row.id, 'tweet_id':row.tweet_id}) 

with open('/tmp/test.json', 'w') as f: 
    json.dump(result, f, indent=2) 

解析HTML花與500K <tr>標籤文件約50秒和周圍需要910M RAM(到HTML加載到與root = LH.parse(filename)一個DOM )。

加載JSON文件到Python字典花了約2秒鐘:

In [14]: time x = json.load(open('/tmp/test.json')) 
CPU times: user 1.80 s, sys: 0.04 s, total: 1.84 s 
Wall time: 1.85 s 
+0

對我來說,這隻給出: { 「data」:[] } – Tom

+0

如果您的HTML看起來不像您發佈的內容,可能會發生這種情況。嘗試使用'root.xpath('// tr/td/text()')'。 (我將編輯我的帖子以顯示我的意思。)兩個正斜槓告訴'root.xpath'遞歸搜索所有'tr'標籤,而不僅僅是在頂層。 – unutbu

+0

好的。那是我的錯。 HTML代碼始終始於行首。我編輯了這個例子,以便更容易閱讀。認爲這不會有所作爲。也會調整示例。 – Tom