2011-11-10 35 views
0

我想读它有一个大的HTML表格,看起来像这样一个12MB +文件:是否有可能加快phpQuery?

<table> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
     <td>e</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
     <td>e</td> 
    </tr> 
    <tr>..... up to 20,000+ rows....</tr> 
</table> 

现在,这是我如何刮它:

<? 

require_once 'phpQuery-onefile.php'; 

$d = phpQuery::newDocumentFile('http://localhost/test.html'); 

$last_index = 20000; 

for ($i = 1; $i <= $last_index; $i++) 
{ 
    $set['c1'] = $d['tr:eq('.$i.') td:eq(0)']->text(); 
    $set['c2'] = $d['tr:eq('.$i.') td:eq(1)']->text(); 
    $set['c3'] = $d['tr:eq('.$i.') td:eq(2)']->text(); 
    $set['c4'] = $d['tr:eq('.$i.') td:eq(3)']->text(); 
    $set['c5'] = $d['tr:eq('.$i.') td:eq(4)']->text(); 
} 

// code to insert to db here... 

?> 

我的基准说,这需要大约5.25小时刮去并插入1,000行到db。根据这些数据,只需要5天就可以完成整个20,000多行。

我的本地机器上运行:

  • XAMPP
  • Win 7的
  • PROC,酷睿i3 2100为3.1GHz
  • RAM,芝奇RipJaws X 4GB双
  • HDD,老SATA

有没有什么办法可以加快这个过程?也许我是在用错误的方式刮擦它?请注意,该文件是在本地访问因此我用http://localhost/test.html

稍快的解决方案:

for ($i = 1; $i <= $last_index; $i++) 
{ 
    $r = $d['tr:eq('.$i.')']; 

    $set['c1'] = $r['td:eq(0)']->text(); 
    $set['c2'] = $r['td:eq(1)']->text(); 
    $set['c3'] = $r['td:eq(2)']->text(); 
    $set['c4'] = $r['td:eq(3)']->text(); 
    $set['c5'] = $r['td:eq(4)']->text(); 
} 

// code to insert to db here... 

?> 
+0

您应该使用现成的表格提取库,而不是自己收集数据。 (例如http://blog.mspace.fm/2009/10/14/parse-an-html-table-with-php/ - 尽管你必须小心,如果这个正则表达式对你的情况来说足够强大。) – mario

+0

@mario是不是phpQuery已经是一个现成的库? – IMB

回答

2

我从来没有与phpQuery工作,但看起来像一个非常次优的方法来解析一个巨大的文件:有可能phpQuery在每次使用tr:eq('.$i.')加载一行时必须遍历整个事物。

的更简单(大概也更快)的方式是简单地通过文档的每个tr元素行走,并处理每一个元素在foreach循环的孩子。你甚至不需要phpQuery。

请参阅How to Parse XML File in PHP了解各种解决方案。

+0

嗯,但我不解析XML,只是HTML将工作? – IMB

+0

@IMB如果HTML是干净的,没关系。然而,你可以先试着坚持使用phpQuery,你只需要改变你的方法:让phpQuery一次性加载所有'tr's(即所有'table's的孩子名为'tr' ...),然后走通过他们。这可能已经快几个数量级了。 –

+0

HTML不是很干净。我有点明白你在说什么,但我不知道如何在代码中做到这一点,而不是我在上面做的。我如何加载所有TR,而不需要在每个TR中都行走?我将不得不做一个双foreach,让每个TDs是正确的?听起来似乎对我来说更慢。 – IMB