2012-04-23 7 views
1

私は多くの質問と多くの答えを読んだが、私は自分の質問に直接答えを見つけることができなかった。すべての答えは、私がやりたいことと非常に一般的でも異なっていた。私はこれまでHTML :: TableExtractやHTML :: TreeBuilder :: XPathを使用する必要がありましたが、実際に値を格納するために使用することはできませんでした。私は何とかテーブルの行の値を取得し、ダンパーでそれらを表示することができます。このようなHTMLファイル内のテーブルの値を読み取ってPerlに格納する方法は?

何か:

foreach my $ts ($tree->table_states) { 
foreach my $row ($ts->rows) { 
    push (@fir , (Dumper $row)); 
} } 
print @sec; 

しかし、これは本当に私が探しているものをやっていません。私は一緒にペアとして行の値を格納できる場合には便利でしょう

<table><caption><b>Table 1 </b>bla bla bla</caption> 
<tbody> 
    <tr> 
     <th ><p>Foo</p> 
     </th> 

     <td ><p>Bar</p> 
     </td> 

    </tr> 

    <tr> 
     <th ><p>Foo-1</p> 
     </th> 

     <td ><p>Bar-1</p> 
     </td> 

    </tr> 

    <tr> 
     <th ><p>Formula</p> 
     </th> 

     <td><p>Formula1-1</p> 
      <p>Formula1-2</p> 
      <p>Formula1-3</p> 
      <p>Formula1-4</p> 
      <p>Formula1-5</p> 
     </td> 

    </tr> 

    <tr> 
     <th><p>Foo-2</p> 
     </th> 

     <td ><p>Bar-2</p> 
     </td> 

    </tr> 

    <tr> 
     <th ><p>Foo-3</p> 
     </th> 

     <td ><p>Bar-3</p> 
      <p>Bar-3-1</p> 
     </td> 

    </tr> 

</tbody> 

</table> 

:私は値を格納したいHTMLテーブルの構造を追加します。

予想出力は、 (Foo、Bar、Foo-1、Bar-1、Formula、Formula-1 Formula-2 Formula-3 Formula-4 Formula-5、..)の値を持つ配列のようなものになります。 ..) 私にとって重要なことは、各タグの値を格納する方法とタグツリー内を移動する方法を学ぶことです。

+1

期待される出力で質問を編集できますか? – tuxuday

答えて

3

XPathとDOM操作について学んでください。

use strictures; 
use HTML::TreeBuilder::XPath qw(); 
my $dom = HTML::TreeBuilder::XPath->new; 
$dom->parse_file('10280979.html'); 

my %extract; 
@extract{$dom->findnodes_as_strings('//th')} = 
    map {[$_->findvalues('p')]} $dom->findnodes('//td'); 
__END__ 
# %extract = (
#  Foo  => [qw(Bar)], 
#  'Foo-1' => [qw(Bar-1)], 
#  'Foo-2' => [qw(Bar-2)], 
#  'Foo-3' => [qw(Bar-3 Bar-3-1)], 
#  Formula => [qw(Formula1-1 Formula1-2 Formula1-3 Formula1-4 Formula1-5)], 
#) 
関連する問題