Извлечение таблицы HTML с помощью Perl - PullRequest
0 голосов
/ 24 июля 2011

У меня есть следующая таблица:

<table cellpadding="4" cellspacing="0" border="0">
        <tr>
            <td>
                <span class="label">Label1< /pan> 
            </td>
            <td>
                label1_value1
            </td>
        </tr>
        <tr>
            <td>
                <span class="label">Label2</span> 
            </td>
            <td>
                            Label2_value1 <br/>
                            Label2_value2 <br/>

            </td>
        </tr>

        <tr valign="top">
            <td>
                <span class="label">Label3</span> 
            </td>
            <td>

                Result 1<br/>

                Result 2<br/>
                <span class="related"> - 
                                                     Result 1  SP2<br/> </span>
            </td>
        <\tr>
</table>

Я хочу использовать HTML :: TableExtract для извлечения этой таблицы

Я использую следующий код для извлечения таблицы:

$te->parse($table_content);
foreach my $row ($te->rows) {
    if (defined($row->[1])) {
        $row->[1]=~s/^\s+//gm;
        $row->[1]=~s/\s+$/;/gm;
        print $row->[1],"\n";
    }
}

Я хочу получить результат в этом формате:

label1_value1,label1_value1;label1_value2,result1;result2-result3

, но я получаю неправильные результаты, может кто-нибудь помочь в том, что проблема с моим кодом или если есть возможность проанализировать участки с HTML:: TableExtract

Я получаю следующее: label1_value1 Label2_value1 Label2_value2;

result1

result2

-

reuslt1;

1 Ответ

6 голосов
/ 24 июля 2011

Во-первых, в вашем HTML есть некоторые ошибки, такие как </pan> и <\tr> и незамкнутый тег span. Как только они исправлены, код

#!/usr/bin/env perl

use warnings; use strict;
use HTML::TableExtract;

my $te = HTML::TableExtract->new(
    attribs => {
        cellpadding => '4', cellspacing => '0', border => '0'
    }
);

my ($table) = $te->parse(do { local $/; <DATA>} );
for my $row ( $table->rows ) {
    for my $cell (@$row) {
        $cell =~ s/^\s+//;
        $cell =~ s/\s+\z/;/;
        $cell =~ s/\s+/ /g;
    }
    print join("|", @$row), "\n";
}

даст вам:

Label1;|label1_value1;
Label2;|Label2_value1 Label2_value2;
Label3;|Result 1 Result 2 - Result 1 SP2;

Теперь я не знаю, какая логика приведет к тому, что вы получите желаемый результат:

label1_value1,label1_value1;label1_value2,result1;result2-result3

Не могли бы вы предоставить больше информации о том, что вы пытаетесь сделать?

...