2013-07-04 3 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 таблицы с 500000 строк, человек, это огромное, я бы сказал, слишком огромный ... Почему не использовать пагинацию ? Кстати, откуда пришли первые данные? Я не думаю, что ты жестко закодировал свою таблицу, верно? –

+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

, тогда u должен использовать 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, можно разобрать HTML с

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) 

Это заняло около 50 секунд на файл с 500К <tr> тегов и требуется около 910m RAM (для загрузки HTML в DOM с root = LH.parse(filename)).

Загрузка файла 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

Смежные вопросы