-1

JSON ファイルに変換する必要がある巨大な HTML テーブル (約 500,000 行) があります。テーブルは次のようになります。

<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…&lt;/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 オプションがあれば、私はかなり賛成です。

4

3 に答える 3

0

Python とlxml パッケージを使用すると、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)

500K のタグを持つファイルで約 50 秒かかり、約<tr>910M の RAM が必要でした (.html を使用して HTML を DOM にロードするためroot = LH.parse(filename))。

json ファイルを Python dict にロードするのに約 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
于 2013-07-04T10:23:10.417 に答える
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));

これは質問 です javascriptで次のテーブルをJSONに変換する方法は?

js のヘルプが必要な場合は、質問してください。これでうまくいくはずです。

于 2013-07-04T10:16:10.970 に答える
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();
于 2013-07-04T10:14:52.143 に答える