1

私はたくさんの質問と答えを読みましたが、私の質問に対する正解は見つかりませんでした。すべての答えは非常に一般的であるか、私がやりたいこととは異なっていました。これまでのところ、HTML::TableExtractまたはHTML::TreeBuilder :: XPathを使用する必要がありますが、値を格納するために実際に使用することはできませんでした。どういうわけか、テーブルの行の値を取得して、Dumperで表示することができました。

このようなもの:

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

しかし、これは私が探していることを実際には行っていません。値を保存するHTMLテーブルの構造を追加します。

<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>

行の値をペアとして一緒に格納できれば便利です。

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

4

1 に答える 1

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)],
# )
于 2012-04-23T14:45:13.893 に答える